C6067

警告 C6067:参数 <number> 在对 <function> 调用中必须是字符串的地址

此警告意味着格式说明符和函数参数不匹配。即使此警告意味着使用了字符串的地址,也必须在更正此问题之前先检查函数所接受的参数类型。例如,printf 的 %s 规范需要字符串参数,但是 scanf 中的 %s 规范需要字符串的地址。

此缺陷有可能会导致某种形式的系统崩溃或损坏。

示例

在下面的代码中,因为传递的是整数而非字符串,所以会生成此警告:

#include <stdio.h>
void f_defective( )
{  
  char *str = "Hello, World!";
  printf("String:\n %s",1); // warning
  // code ...
}

若要更正此警告,请向 printf 传递字符串形式的参数,如下面的代码所示:

#include <stdio.h>
void f_corrected( )
{  
  char *str = "Hello, World!";
  printf("String:\n %s",str); 
  // code ...
}

在下面的代码中,因为在向 scanf 传递参数 buffer 时,指定的间接寻址级别有误,所以会生成此警告:

#include <stdio.h>
void h_defective( )
{
  int retval;
  char* buffer = new char(20);
  if (  buffer )
  {
    retval = scanf("%s", &buffer); // warning C6067
    // code...
    delete buffer ;
  }
}

若要更正上述警告,请传递正确的参数,如下面的代码所示:

#include <stdio.h>
void h_corrected( )
{
  int retval;
  char* buffer = new char(20);
  if ( buffer )
  {
    retval = scanf("%s", buffer);
    // code...
    delete buffer;
  }
}

下面的代码使用安全的字符串操作函数来更正此警告:

#include <stdio.h>
void f_safe( )
{
  char buff[20];
  int retVal;
  
  sprintf_s( buff, 20, "%s %s", "Hello", "World!" );
  printf_s( "String:\n   %s  %s", "Hello", "World!" );
  retVal = scanf_s("%s", buff, 20);
}

请参见

参考

sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l

printf、_printf_l、wprintf、_wprintf_l

scanf_s、_scanf_s_l、wscanf_s、_wscanf_s_l