【问题标题】:Reading words until EOF读单词直到 EOF
【发布时间】:2018-01-11 18:02:38
【问题描述】:

我正在尝试制作一个程序,它可以在 EOF 之前读取单词,然后对这些单词执行一些操作。它现在做什么并不重要,所以我们只是说它会立即将它们打印回来。所以这就是它在控制台中的样子:

这些是一些词[然后我在这里按下 EOF 键]

这些

一些

单词

这是我尝试过的方式:

#include <stdio.h>
#include <string.h>
#define MAX 21

int r_word(char s[]){
  char c;
  int i = 0;
  while((c=getchar())!=EOF && c!=' '){
    s[i] = c;
    i++;
  }
  s[i] = '\0';
  return i;
}

int main(){
  char word[MAX];
  int d;

  while((d = r_word(word))>0){
    printf("%s\n", word);
  }
  return 0;

}

所以我的想法是 r_word 函数将一个单词逐个字符存储在字符串 's' 中,以便它可以检查 EOF。 但是,与我的预期不同,这就是我运行它时的样子:

这些是一些词[EOF]

这些

一些 [然后它停在这里,我猜仍然在循环中] [再次点击EOF]

单词

因此,无论我输入多少个单词,它都会打印出除最后一个以外的所有单词,然后程序就会挂在那里,直到我在打印出最后一个单词时再次点击 EOF。 有什么想法吗?

附:这是一个学校示例,其中我们不允许使用任何高级扫描方法,例如 fscanf 或其他。只允许使用基本功能。

【问题讨论】:

  • char c --> int c 输入EOF表示ctrd+d/wEnter
  • 如果一个单词的长度超过MAX会怎样?
  • 我还没有开始处理那个案子,但我认为现在不相关
  • 我说的修改你做了吗?
  • @koy - 你应该首先学会考虑它。忘记这些事情的编码人员只会留下错误 - 将来会咬他们

标签: c scanf eof words


【解决方案1】:

在最后一个单词中添加“空格”“EOF”而不是“EOF”应该可以解决问题。

【讨论】:

    【解决方案2】:

    看看下面的代码。我使用了 '\n' 而不是 'EOF',然后是一个小技巧来处理空格。希望对你有帮助。

    #include <stdio.h>
    #include <string.h>
    
    #define MAX 32
    
    void handleWords()
    {
        int i = 0;
        char input, word[MAX];
        while((input = (char) getchar()) != '\n' && i < MAX-1)
        {
            if(input == ' ') input = '\n';
            word[i++] = input;
        }
        word[i] = '\0';
        printf("%s\n", word);
    }
    
    int main()
    {
        handleWords();
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      然后程序就一直挂在那里,直到我在打印出最后一个单词时再次点击 EOF

      OP first "[hit the EOF key]" 仅将键盘缓冲区刷新到stdin

      此时,stdin 具有 "these are some words" 和代码处理将打印出来的内容:

      these<line feed>
      are<line feed>
      some<line feed>
      

      "words" 已被fgetc() 完整阅读,但r_word()'s' 之后仍在等待。

      OP 2nd "[hit the EOF key]" 表示文件结束,因此 (c=getchar()) 收到 EOF 并出现最终输出。

      words<line feed>
      

      要进行补救,请查看接口是否允许单个键盘事件表示文件结束或append a space

      或者在一行输入完成之前不要打印。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        相关资源
        最近更新 更多