c - 不知道为什么使用 scanf 时 while 循环的工作方式不同
问题描述
我是学习 C 的新手,据我所知,我知道如果有人给出条件,while 循环将永远运行,例如while (1 == 1)
它将成为一个永远循环。
但是在阅读一本书时,我注意到了一个代码,例如
#include<stdio.h>
int main() {
char a;
int started = 0;
puts("Scanning\n");
while (scanf("%s[^\n]",&a) == 1)
{
if (a >= 65 && a <= 90)
{
printf("Char is capital\n");
}
else
{
printf("Not cap.\n");
}
}
puts("Done\n");
return 0;
}
命令行 =>char.exe < file.txt
它从 stdin 获取输入,但 scanf 返回参数的数量,即 1,因此条件应变为 while(1 == 1)
但是为什么这不是一个永久循环并且在读取文件后存在?
谢谢
解决方案
在
char a;
...
while (scanf("%s[^\n]",&a) == 1)
您的格式无效,因为专用于字符串,而您只想读取一个字符,因此您将至少为结尾的空字符写出字符,从而产生未定义的行为
做
char a;
...
while (scanf(" %c",&a) == 1)
并注意格式中的空格,如果要管理所有字符,请将其删除
在
if (a >= 65 && a <= 90)
使用 ASCII 码是错误的,这不可读且与非 ASCII 不兼容
你可以做
if (a >= 'A' && a <= 'Z')
或更好地使用isupper ( <ctype.h>
) 因为它不是保证,而不是大写字母是连续的
您的printf可以替换为puts删除字符串中的 \n 或fputs,让printf打印一个简单的字符串(没有 % 和 arg)是没有用的
但是为什么这不是一个永久循环并且在读取文件后存在?
scanf在 EOF 上不返回 1,因此循环在 EOF 上停止,关于scanf系列:
这些函数返回成功匹配和分配的输入项的数量,该数量可能少于提供的数量,或者在早期匹配失败的情况下甚至为零。
如果在第一次成功转换或匹配失败发生之前到达输入结尾,则返回值 EOF。如果发生读取错误,也会返回 EOF,在这种情况下会设置流的错误指示符(请参阅 ferror(3)),并设置 errno 来指示错误。
推荐阅读
- c++ - 为什么我的程序两次打印文件的最后一条记录?
- datatable - 是否可以扩展/覆盖 Ckan datatables_view 插件?
- reactjs - 如何将 parse.text 的结果传递到向导表单的状态?
- r - 如何在不编写大量 if/else 的情况下在 R 中的线性模型中添加变量?
- api - 尝试使用 Zillow API 网络服务时返回错误 6
- cloud - 如何使用 nat 网关将 Internet 绑定流量从公共子网发送到私有子网
- javascript - html 中的 Javascript 文件在 React 中不起作用
- mysql - 获取按 id 分组的 mySQL 查询的值
- python - Python而True在同一行中有两个变量?
- view - 我的数据块中的表架构更改不在我的视图中