【问题标题】:Code after fscanf() doesn't executefscanf() 之后的代码不执行
【发布时间】:2015-01-24 17:45:04
【问题描述】:

我对 C 很陌生,这里有这个简单的代码:

int main(int argc, char **argv){

    FILE *input = stdin;

    char string[20];
    while (fscanf(input, "%s",string)) {
        printf("String: %s \n",string);
    }
    printf("Done");

    return 0;
}

我遇到的问题是“完成”行永远不会被打印出来。当 while 循环从标准输入完成读取后,它不会执行任何操作。有什么我不知道的概念吗?提前致谢。

【问题讨论】:

  • 您可能会遇到缓冲区溢出。确保您在提示中输入的字符少于 19 个(或扩大字符串 [20] 的大小)
  • 这还不够,请张贴部分输入文件。
  • char string[20] 不是说每个所谓的字符串不分配20个字符吗?我只输入了一个少于 20 个字符的单词,循环后的 printf 仍然没有被执行。
  • “当 while 循环完成从标准输入读取时” - 它实际上是否完成了从标准输入的读取?你是如何终止标准输入的?
  • @dhint4 while 循环说当条件为真时做某事。在这种情况下,只要它能够匹配输入,它将继续从标准输入读取。我要问的是,您如何表示没有更多可用输入?正如其他人所暗示的那样,您通常需要按 ctrl+D 或类似键来表示您没有更多的“stdin”输入。

标签: c scanf


【解决方案1】:

你需要把它改成寻找EOF

while (EOF != fscanf(input, "%s",string)) {

EOF 字符在 Windows 中为 ^Z,在 *nix 中为 ^D(即 Ctrl+Z 或 Ctrl+D)。输入 EOF 字符后,您仍然需要按 Enter,因为键盘输入将被行缓冲。

【讨论】:

  • 感谢您的回复,但我刚刚尝试过,但完成的 printf 语句仍未执行。
  • @dhint4 请注意,“^D” frasnian 的意思是“按住控制并按 D”。
  • @davmac,如果我按 Crtl-D,printf 语句会执行,但我希望它自动完成,为什么我的 while 循环中的 EOF 不这样做?
  • Minor:更惯用的方法是while (1 == fscanf(input, "%s",string)) {。 IOW:如果输入不符合预期,则停止。当然这没什么区别,因为fscanf(input, "%s",string) 不会返回 0,但是如果格式更有趣,比如fscanf(input, "%d", &i),继续使用== 1 比继续使用!= EOF 更有意义。
  • @NisseEngström:你只会吓坏 OP - 当程序终止时,缓冲区将被刷新,应用程序中的最后一条语句是 printf 调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
相关资源
最近更新 更多