代码感觉没错,也能正常运行,但是输入完 1 c 2,按Enter健结束,就会被异常终止!
试验了很多次,发现scanf_s(“%d %c”,&a,&b)读取%d 之后再读%c就会发生这种情况。
讨教高手,是不是scanf_s()哪里本人用错了?还是其他什么原因?
int main(void)
{
int a=0,c=0; char b=0;
scanf_s(” %d %c %d”,&a,&b,&c);
printf(“a=%d b=%c c=%d”,a,b,c);
return 0;
}
试验了很多次,发现scanf_s(“%d %c”,&a,&b)读取%d 之后再读%c就会发生这种情况。
讨教高手,是不是scanf_s()哪里本人用错了?还是其他什么原因?
int main(void)
{
int a=0,c=0; char b=0;
scanf_s(” %d %c %d”,&a,&b,&c);
printf(“a=%d b=%c c=%d”,a,b,c);
return 0;
}
解决方案
9
微软的_s对于字符串要求传入缓存长度, 不会用_s就用原版…反正连警告都不看:
C4477 “scanf_s”: 格式字符串“%c”需要类型“unsigned int”的参数,但可变参数 3 拥有了类型“int *”
C4477 “scanf_s”: 格式字符串“%c”需要类型“unsigned int”的参数,但可变参数 3 拥有了类型“int *”
7
scanf_s(” %d %c %d”,&a,&b,1,&c);
14
scanf_s中%c还需要一个参数,表示长度
假如不想加,就用scanf
假如不想加,就用scanf
24
高版本的VS都会让你用scanf_s来替代scanf
1.可以:Alt+F7,打开工程属性,然后找到图片上标注的地方,添加一行内容_CRT_SECURE_NO_DEPRECATE就OK了
2.假如用scanf_s,在读入%c或%s的时候必须多传入一个参数用来指定读取的长度,否则会出错
1.可以:Alt+F7,打开工程属性,然后找到图片上标注的地方,添加一行内容_CRT_SECURE_NO_DEPRECATE就OK了
2.假如用scanf_s,在读入%c或%s的时候必须多传入一个参数用来指定读取的长度,否则会出错
5
#pragma warning(disable:4996) ...