【问题标题】:Why should we track the inside of the word in K&R Exercise 1-11?为什么我们要在 K&R 练习 1-11 中跟踪单词的内部?
【发布时间】:2020-07-27 04:16:01
【问题描述】:

这是练习:

编写一个程序,每行打印一个单词。

我对这个练习的解决方案如下:

main() {
    int c; 
    while((c = getchar()) != EOF) { 
        if(c == ' ' || c == '\t' ) 
            putchar('\n');
        else
            putchar(c);
        }
    }
}

据此link 这是一个糟糕的解决方案,但我不确定我明白为什么。

如果能帮助我理解这一点,我将不胜感激。

【问题讨论】:

  • 也许是因为问题要求您一次打印一个单词,但您一次打印一个字符?一个词通常由多个字符组成。
  • 除了前面的评论,考虑一下当你输入a b c时会发生什么。或者,正如链接中的一个 cmets 所说,使用您自己的 .c 源文件作为输入运行它。
  • 多个前导、包含或尾随空格会导致输出中出现空白行。解决方案是添加一个简单的标志来跟踪您是(1)在一个单词中读取字符还是(2)在读取空白的单词之间,并且仅在您从读取字符转换为空白时输出您的'\n'。一个计数单词的示例(适用于此)Local variables and memory in c

标签: c input character whitespace


【解决方案1】:

问题是当您的输入在后续顺序中包含多个换行符、制表符或空格时。

然后它总是跳到一个新行,虽然它不应该。

那么“每行打印一个字”的要求就不满足了。

您需要注意换行符、制表符或空格是否出现在一系列非指令字符之后。所以我们需要一个"STATE" 参数来记录当前状态。

Chrismath 的解决方案包括:

// print input one word per line 

#define IN 1 
#define OUT 0 

int main (void) 
{ 
      int c, state; 
      // start without a word 
      state = OUT; 
         
      while ((c = getchar()) != EOF) { 
              // if the char is not blank, tab, newline 
              if (c != ' ' && c != '\t' && c != '\n') { 
                      // inside a word 
                      state = IN; 
                      putchar(c); 
              // otherwise char is blank, tab, newline, word ended 
              } 
              else if (state == IN) { 
                      state = OUT; 
                      putchar('\n'); 
              } 
      } 
      return 0;
}

仅当 state 为 IN 时才会打印换行符,这意味着在一行中至少打印了一个字符的单词,然后才能到达另一行。

有人可能会争辩说一个词不会是单个字符,但是我们需要一个明确的要求,即一个词至少由多少个字符组成,但这并没有提供给这里的任务,所以一个字是合理的,合法的。

【讨论】:

    【解决方案2】:

    比较几个答案后,我上面写的解决方案与问题链接中的正确解决方案之间的区别在于,没有为每个空白、制表符或换行符创建换行符。正确答案检查是否已经占了一个空格并输出对应的换行符,如果还有空格则不输出另一个换行符,从而回答“每行一个字”的问题

    【讨论】:

    • 确保在答案中也包含更正的代码。 ;)
    • @RobertoCaboni:回答问题不需要代码,这就是为什么问题中的代码不正确,而不是正确的代码是什么。吸取教训注意程序规范的细节本身就很有价值。
    • @EricPostpischil ...尽管如此,一些代码 sn-ps,例如 "I would do this stuff instead of this other stuff" 会使答案更完整。任何人都需要它,我不明白为什么它不应该与 OP 相同。我真的很高兴 OP “吸取了教训”,我打算投赞成票。这就是为什么我要求完整性。 ;)
    猜你喜欢
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多