C6067
更新:2007 年 11 月
警告 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