Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scanf的有用上下文(…)!=EOF_C_Scanf - Fatal编程技术网

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表示。