【问题标题】:Kernighan & Ritchie code example confusionKernighan & Ritchie 代码示例混淆
【发布时间】:2014-12-01 06:30:13
【问题描述】:

在这个代码示例中提到第二个“c = getchar()”有什么原因吗?

#include <stdio.h>
/* copy input to output; 1st version */  

int main(void) {

    int c;

    c = getchar();
    while (c != EOF) {
        putchar(c);
        c = getchar(); // <-- I mean this one.
    }
    return 0;
}

【问题讨论】:

  • 这是一个 while 循环,每次迭代都会读取并放置一个字符,如果没有那个“第二个”getchar,它将如何工作?
  • @OlegMikheev,那是我的疏忽。我在终端运行这个版本的代码:while((c = getchar()), c != EOF) { putchar(c);并且看不到结果之间的差异。愚蠢的情况。

标签: c input while-loop getchar


【解决方案1】:
c = getchar();                    //read for the first time before entering while loop
    while (c != EOF) {
        putchar(c);
        c = getchar();            // read the next input and go back to condition checking
    }
    return 0;
  1. 第一个getchar() 读取第一次输入的字符。
  2. 第二个getchar()继续读取下一个输入,直到EOF

换句话说,while (c != EOF) 的目的是不断检查c 是否为EOF。如果c 没有改变,那么while() 循环是没有意义的,不是吗?第二个getch() 负责在每次迭代中更改c 的值。

【讨论】:

  • 那是我的疏忽。我在终端中运行这个版本的代码:while((c = getchar()), c != EOF) { putchar(c);} 并且看不出有什么区别。愚蠢的情况。
【解决方案2】:

是的,所以它不会放入 EOF。

它读取第一个字符,检查它是否不是 EOF,然后 putChars 它,然后获取另一个字符,返回到 while 循环的顶部并检查它不是 EOF。

【讨论】:

    【解决方案3】:

    第二个c = getchar() 是读取另一个字符,然后读取另一个字符,直到遇到EOF

    【讨论】:

      【解决方案4】:

      第一个c = getchar(); 只能工作一次,但在while 循环中的c = getchar(); 每次都可以工作,直到c != EOF

      c = getchar(); // Read value of `c` if `c != EOF` it will enter while loop else it will exit
      while (c != EOF) {  // checking condition
         putchar(c);     //printing value of c
         c = getchar(); // again getting new value of c and checking in while loop,  
                          //if condition is true it will continue, else it will exit
      }
      

      【讨论】:

        【解决方案5】:

        它的存在是因为顶部有一个 while 循环测试,但您确实需要中间的测试。除了在循环上方和内部复制代码之外,还有一种方法是使用 break

        while (1) {
            c = getchar();
            if (c == EOF) break; /* test in middle */
            putchar(c);
        }
        

        【讨论】:

          【解决方案6】:

          那是我的疏忽。我在终端中运行这个版本的代码:

          while((c = getchar()), c != EOF) {
          putchar(c);
          }
          

          并且看不到结果之间的差异。愚蠢的情况。 总之谢谢大家。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-08
            相关资源
            最近更新 更多