问题发现(vs2022环境)
大部分初学者伙伴们可能发现很多参考代码中为了判断输入是否结束都会用以下这条代码:
#include<stdio.h>
int main()
{
int x;
while (scanf("%d", &x) != EOF)
{
printf("%d\n", x);
}
}
在很多C语言的资料中都会让大家输入Ctrl+z来让scnaf函数返回EOF(-1)。但是当我们尝试之后会发现程序不会跳出循环
查找问题原因
为了查找问题的原因,我使用如下代码来观察scanf的返回值:
#include<stdio.h>
int main()
{
int x;
printf("%d", scanf("%d", &x));
}
我发现当我连续输入3次Ctrl+z时,在屏幕上才会输出-1。也就是说在vs2022中当我们输入3次Ctrl+z后搜索%d的scanf函数才会返回EOF。
这时我思考如果是两个%d呢?
可以发现还是需要输入三个Ctrl+z而不是6个,这时再考虑如果是char类型和double类型呢?
不难发现浮点型和非字符的整形是一样的,而字符型只用输入两次。
问题的猜测和解决
导致这样的原因我猜测是ctrl+z类似于一个带有指令的字符,而整形和浮点型无法接收字符,但其拥有指令,他可以让原本不能接收字符的%d变为接受字符。在接收到ctrl+z字符后scanf函数内部可能需要再接收一个ctrl+z指令执行ctrl+z字符,才能返回EOF,而%c本就能就收字符,所以只需要输入2个ctrl+z。那为什么猜测ctrl+z是字符呢,是因为我用getchar函数来接收他的值,发现只用输入一次就可以输出EOF,但是也许函数内部已经定好把ctrl+z转化为EOF,所以不敢肯定ctrl+z的字符型参数一定为-1。(以上纯属猜测,如有错误请大佬包含和指正)。
所以以后在vs中我们只要按以上方法只要多输入几次ctrl+z就好啦。
再次基础上的拓展
在vs中ctrl+c也是让scanf返回EOF的,但是有时候我们会发现以下代码会出现以下错误
#include<stdio.h>
int main()
{
char x,y;
y=scanf("%d", &x);
printf("%d", y);
}
这是因为我们是在调试环境下输入的ctrl+c,调试环境和执行(不调试)环境有些许不同,当我们用执行(不调试)时,代码就可以成功的跑起来啦!!
感谢大家能够看到这,希望大家能给我这个新人点个关注,么么哒!!!!