scanf的有用上下文(…)!=EOF
苏。。。我看到一个人说这个代码在处理另一个问题scanf的有用上下文(…)!=EOF,c,scanf,C,Scanf,苏。。。我看到一个人说这个代码在处理另一个问题 while(scanf("%X", &hex) != EOF) { //perform a task with the hex value. } 那么,在什么上下文中抛出EOF标志呢?我想它会无限期地要求一个数字。我添加了另一行代码来测试它,它也完全符合我的预期 这不是文件,这似乎是标准格式。所以此代码何时有用? 也就是说,EOF返回是在什么上下文中抛出的?如果您查看scanf的文档,您将看到如果在分配第一个值之前发生读取失败,
while(scanf("%X", &hex) != EOF) {
//perform a task with the hex value.
}
那么,在什么上下文中抛出EOF标志呢?我想它会无限期地要求一个数字。我添加了另一行代码来测试它,它也完全符合我的预期
这不是文件,这似乎是标准格式。所以此代码何时有用?也就是说,EOF返回是在什么上下文中抛出的?如果您查看
scanf
的文档,您将看到如果在分配第一个值之前发生读取失败,则返回值EOF
。(即文件末尾)
您可以同样测试:
while(scanf("%X", &hex) == 1)
这是我的偏好。我希望有一个输入,因此我将明确说明。如果您查看
scanf
的文档,您将看到如果在分配第一个值之前发生读取失败,则返回值EOF
。(即文件末尾)
您可以同样测试:
while(scanf("%X", &hex) == 1)
这是我的偏好。我希望有一个输入,所以我将是显式的。现实地说,这个输入在linux上很好,因为^d将结束流,从而抛出“错误” 在windows上,此行为是不同的。。。不管它是什么,都不是ctrl+d。不过至少我现在知道了,因为我两者都用
谢谢 实际上,这种输入在linux上是好的,因为^d将结束流,从而抛出“错误” 在windows上,此行为是不同的。。。不管它是什么,都不是ctrl+d。不过至少我现在知道了,因为我两者都用
谢谢 在I/O错误和文件结束时返回EOF。对于
stdin
,I/O错误是一种罕见的事件,对于键盘输入,文件结尾指示通常采用特殊的键序列
重定向输入具有实际用途
假设存在读取十六进制文本并打印出十进制文本的程序:
// hex2dec.c
#include <stdio.h>
int main(void) {
unsigned hex;
int cnt;
while((cnt = scanf("%X", &hex)) == 1) {
printf("%u\n", hex);
}
// At this point, `cnt` should be 0 or EOF
if (cnt != EOF) {
puts("Invalid hexadecimal sequence found.");
return 1;
}
return 0;
}
// hex.txt contents:
abc
123
//hex2dec.c
#包括
内部主(空){
无符号十六进制;
int-cnt;
而((cnt=scanf(“%X”,&hex))==1){
printf(“%u\n”,十六进制);
}
//此时,`cnt`应为0或EOF
如果(cnt!=EOF){
puts(“发现无效的十六进制序列”);
返回1;
}
返回0;
}
//hex.txt内容:
abc
123
使用命令进行转换
hex2dec < hex.txt
2748
291
hex2dec
通过检测
stdin
上的EOF
,程序知道何时返回。EOF
在I/O错误和文件结束时返回。对于stdin
,I/O错误是一种罕见的事件,对于键盘输入,文件结尾指示通常采用特殊的键序列
重定向输入具有实际用途
假设存在读取十六进制文本并打印出十进制文本的程序:
// hex2dec.c
#include <stdio.h>
int main(void) {
unsigned hex;
int cnt;
while((cnt = scanf("%X", &hex)) == 1) {
printf("%u\n", hex);
}
// At this point, `cnt` should be 0 or EOF
if (cnt != EOF) {
puts("Invalid hexadecimal sequence found.");
return 1;
}
return 0;
}
// hex.txt contents:
abc
123
//hex2dec.c
#包括
内部主(空){
无符号十六进制;
int-cnt;
而((cnt=scanf(“%X”,&hex))==1){
printf(“%u\n”,十六进制);
}
//此时,`cnt`应为0或EOF
如果(cnt!=EOF){
puts(“发现无效的十六进制序列”);
返回1;
}
返回0;
}
//hex.txt内容:
abc
123
使用命令进行转换
hex2dec < hex.txt
2748
291
hex2dec
通过检测
stdin
上的EOF
,程序知道何时返回。我认为如果按ctrl-D,可能会得到EOF…请参见EOF
不是抛出的标志。它是一个宏,可扩展为int
类型的常量表达式,通常为(-1)
scanf
返回标准定义的EOF
值。我认为如果按ctrl-D,可能会得到EOF…请参见EOF
不是抛出的标志。它是一个宏,可扩展为int
类型的常量表达式,通常为(-1)
scanf
返回标准定义的EOF
的值。先生。。。可能会导致这样的读取失败?如果输入流关闭(EOF
),则会发生特定的失败。如果输入是无效的(即不是十六进制字符),它将返回0
。这意味着如果你在不EOF
的情况下循环,而你收到了错误的输入,就目前的情况而言,你不会意识到它,你将无限期地循环。考虑将函数调用的结果存储在变量中,或者使用我更明确的循环条件。谢谢…在我们之间,我想我们已经找到了一个完整的答案!还有什么,先生。。。可能会导致这样的读取失败?如果输入流关闭(EOF
),则会发生特定的失败。如果输入是无效的(即不是十六进制字符),它将返回0
。这意味着如果你在不EOF
的情况下循环,而你收到了错误的输入,就目前的情况而言,你不会意识到它,你将无限期地循环。考虑将函数调用的结果存储在变量中,或者使用我更明确的循环条件。谢谢…在我们之间,我想我们已经找到了一个完整的答案!在DOS(和早期的Windows,很久没有签入)上,文件的结尾用ctrl-Z表示。在DOS(和早期的Windows,很久没有签入)上,文件的结尾用ctrl-Z表示。