【问题标题】:scanf(%s) an issue with EOFscanf(%s) EOF 的问题
【发布时间】:2012-12-28 02:41:02
【问题描述】:

我使用 scanf 是因为我们必须使用它。 问题如下: (这只是问题的一个例子):

    int main() {
        char ch [10]={0};
        scanf("%s",ch);

        printf("%s",ch);
    }

如果我运行程序并输入例如:word^Z 当 ^Z 为 EOF 时。 程序留在原地,卡在 scanf 中,尽管我确实输入了 word 然后 ctrl+z 然后 Enter。但不知何故,它停留在 scanf 中,与重定向相同,就像 ctr+z 或其他任何东西都没有问题。

希望能得到帮助

提前致谢, 完全欣赏它:)

【问题讨论】:

  • 哪个操作系统? ^D 在 Linux 上是 EOF,在 Windows 上 ^Z 是 EOF。
  • windows, ^Z 总是 eof 并且它可以工作,除了 scanf %s

标签: c++ c codeblocks


【解决方案1】:

scanf 使用空格作为分隔符将读取的数据存储到各个字段中。从命令行输入ControlZ,然后Enter只将EOF字符放入输入流,scanf()继续等待空白。如果您再次按 Enterscanf 将收到空白字符,并且包括 EOF 在内的所有内容都将存储到 ch 数组中。

这是一个示例运行。第一行是输入,第二行是输出。

Hello^Z
Hello→

【讨论】:

  • 但是这个箭头是什么鬼东西?我也试过getchar,我把while(c!=EOF)c=getchar();如果 c==EOF,它应该返回 0,我继续输入像 abc^Z 这样的字符,然后它就不会进入 EOF,太奇怪了?
  • 嗯,显然 EOF 是一个不可打印的字符,但是由于您已将其放入 char 数组中,因此必须将其作为字符串的一部分打印。那就是箭头。
  • getchar() 返回 int 以适应 EOF。如果将返回值作为字符进行比较,则它永远不会匹配 EOF。尝试将其作为 int 进行比较,它应该可以工作。
  • 没有EOF字符!!当流关闭时,getchar 返回 EOF。键入 ctrl-z 不会“[将] EOF 字符放入输入流, it just closes the stream. Whenever you see the phrase EOF 字符`,这是错误的。
  • @WilliamPursell 感谢您指出这一点。答案中的EOF character 是一个失误,不是故意的。我的意思是,无效字符将替换为特殊的 EOF 指示符。 (在 Windows 上,它是 ASCII 码 0x26。)
猜你喜欢
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多