报错:scanf_s函数报错:没有为格式字符串传递足够的参数
int main() {
char s1[20] = "i m name";
char *p1, *p2;
char s3[10] = {0};
p1 = s1;
p2 = s3;
printf("请输入你的名字: \n");
scanf_s("%s",&s3);
printf("%s\n", s3);
for (; *p1 != '\0'; p1++) {
if (*p1 == *p2) {
p2 = s3;
}
printf("I am %s\n", s3);
}
while (true){}
return 0;
}
这个问题很变态
解决办法:在使用%c和%s读入字符或字符串时,应在地址参数后附加一个缓冲区边界值。
int main() {
char s1[20] = "i m name";
char *p1, *p2;
char s3[10] = {0};
p1 = s1;
p2 = s3;
printf("请输入你的名字: \n");
//scanf_s("%s",&s3);
scanf_s("%s",&s3,sizeof(s3)); //使用sizeof
printf("%s\n", s3);
for (; *p1 != '\0'; p1++) {
if (*p1 == *p2) {
p2 = s3;
}
printf("I am %s\n", s3);
}
while (true){}
return 0;
}
总结;就会提示你没有为格式字符串传递足够的参数。
首先我们来看一下scanf和scanf_s的区别
scanf()不会检查输入边界,可能造成数据溢出。
scanf_s()会进行边界检查。
scanf()函数是标准C中提供的标准输入函数,用以用户输入数据
scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。
上面的程序有点复杂;下面来一个简单点的例子:
int main(void) {
char str1[30] = { 0 };
char str2[30] = { 0 };
char str3[30] = { 0 };
//gets() 用法
printf("Input a string: ");
gets_s(str1);
//scanf() 用法
printf("Input a string: ");
scanf_s("%s", str2);
scanf_s("%s", str3);
printf("\nstr1: %s\n", str1);
printf("str2: %s\n", str2);
printf("str3: %s\n", str3);
while (true){}
return 0;
}
上面的代码当你输入字符串的时候会报错:没有为格式字符串传递足够的参数