Not sure why while loop works different when using scanf
在学习C的过程中,我是一个新手,据我所知,我知道,如果有人给出诸如
但是在读一本书时,我注意到了诸如
之类的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
命令行=>
它从标准输入中获取输入,但scanf返回参数的数量,即1,因此条件应在
时变为
但是为什么这不是永久循环,并且在读取文件后仍然存在?
谢谢
在
1 2 3 4 |
您的格式无效,因为在您只想读取char时专用于字符串,因此您将至少在char中写出结尾的空char,从而产生未定义的行为
做
1 2 3 |
并注意格式中的空格,如果要管理所有字符,请将其删除
在
1 if (a >= 65 && a <= 90)
使用ASCII码是错误的,这是不可读的并且与非ASCII不兼容
你可以做
1 | if (a >= 'A' && a <= 'Z') |
或更好地使用isupper(
您的printf可以被替换为放下\\
字符串或fputs中的值对于让printf打印一个简单的字符串(没有%和arg)是没有用的
But why this is not a forever loop and exists after reading the file?
scanf在EOF上不返回1,因此循环在EOF上停止,关于scanf家族:
These functions return the number of input items successfully matched and assigned, which can be fewer than provided for, or even zero in the event of an early matching failure.
The value EOF is returned if the end of input is reached before either the first successful conversion or a matching failure occurs. EOF is also returned if a read error occurs, in which case the error indicator for the stream (see ferror(3)) is set, and errno is set indicate the error.
But why this is not a forever loop and exists after reading the file?
仅当
*提供了该程序的行为的良好定义。由于注释和另一个答案中所述的原因,您的程序不是。
输入字母时,条件
再次满足条件
此循环是不确定的循环,您可以继续输入字母,而永远不会到达
But why this is not a forever loop and exists after reading the file?
尝试读取堆栈变量中的文件将导致堆栈崩溃,并且程序将崩溃。
在Internet上的C中寻找不同的存储类型和内存管理。
您是否按照以下方式运行它:
1 | cat <your file>| ./a.out |
分配一个足够大的缓冲区,例如
传递
1 2 |
现在注意
用于读取较大文件/行的规定似乎超出了您的实验范围。
工作代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
函数scanf返回以下值:
-
>0 成功转换和分配的项目数。 -
0-未分配任何项目。
-
<0-遇到读取错误,或者在出现任何错误之前到达文件结尾(EOF) 进行了分配。