关于sacnf返回值的问题

关于sacnf返回值的问题,第1张

在学C语言的时候,关于scanf的返回值一直有些疑惑,它的返回值到底返回什么呢,特别是什么时候会返回EOF呢,是不是只要读不到正确的值就会返回EOF呢?下面来探究一下。
下看一下这段代码

int main()
{
	int a = 0;
	while(scanf("%d", &a) == EOF)
	{
		printf("hehe\n");
	}

	return 0;
}

如果我们直接输入一个字母,那么显然与a的类型不匹配,那么此时scanf什么都没有读到,那么它的返回值会是EOF吗?
该代码的结果如下:

显然,此时scanf的返回值并不是EOF,如果将代码改成这样并且输入一个字母a:

int main()
{
	int a = 0;
	while(scanf("%d", &a) == 0)
	{
		printf("hehe\n");
	}

	return 0;
}

运行结果将会变成这样:

可以看出,scanf的返回值为0,因为scanf的返回值是它成功读到的变量个数,上面a读取失败,返回值为0。
当scanf发生错误或者遇到文件结尾时返回EOF,在Windows上可以用ctrl+z模拟文件结束,在输入的时候直接按ctrl+z就行,大概要输入两三次,至于怎么让scanf出错,我还没有遇到过,欢迎大佬在评论区指教。
还有就是在上面的代码中有点小问题,既然第一次输入了a,这样scanf返回值肯定为0,那么第二次循环再次输入时却没有提示再次输入,而是直接进入到了循环中,原因时此时缓冲区中仍然有a,scanf再次读取失败,返回0。即缓冲区中有值时,scanf时不能往下读取的。
可以这样解决这个问题:

int main()
{
	int a = 0;
	int* p = 0;
	while(scanf("%d", &a) == 0)
	{
		printf("hehe\n");
		setbuf(stdin, NULL);
	}

	return 0;
}

用setbuf清理缓冲区即可,或者用while ((c = getchar()) != EOF && c != ‘\n’);来清理缓冲区。

综上,scanf的返回值为它成功读取到的数据,失败或文件结尾就返回EOF,EOF的值为-1,可以用ctrl+z来模拟文件结尾让scanf返回-1,另外,缓冲区中有值时,scanf时不能往下读取,可用setbuf清理缓冲区即可,或者用while ((c = getchar()) != EOF && c != ‘\n’);来清理缓冲区。最后补充一下,scanf再读取字符时是会读取空格或换行符的,但是在读取字符串时,空格和换行符都不读取。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/717012.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-25
下一篇2022-04-25

发表评论

登录后才能评论

评论列表(0条)

    保存