Kernighan& Ritchie代码示例混乱

时间:2014-12-01 06:30:14

标签: c input while-loop getchar

第二个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;
}

6 个答案:

答案 0 :(得分:3)

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. first getchar()读取第一次输入字符。
  2. getchar()继续阅读下一个输入,直到EOF
  3. 换句话说,while (c != EOF)的目的是继续检查c是否为EOF。如果c未更改,则while()循环无意义,不是吗?第二个getch()负责在每次迭代中对c的值进行处理。

答案 1 :(得分:1)

是的,所以它不会putchar EOF。

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

答案 2 :(得分:1)

第二个c = getchar()是读取另一个字符,而另一个字符是EOF

答案 3 :(得分:0)

第一个c = getchar();只能使用一次,但c = getchar();内部while循环每次都会有效,直到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
}

答案 4 :(得分:0)

它就在那里因为一个while循环测试在顶部,但你真的需要在中间进行测试。在循环上方及其内部复制代码的替代方法是使用break

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

答案 5 :(得分:0)

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

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

并且看不出结果之间的区别。愚蠢的情况。 无论如何,感谢所有人。