2014-12-01 6 views
0

Есть ли причина второго упоминания «c = getchar()» в этом примере кода? Kernighan & Ritchie пример примера путаницы

#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; 
} 
+1

Это цикл while, который на каждой итерации читает и помещает символ, как бы он работал без этого «второго» getchar? –

+0

@ ОлегМихеев, это мое невнимание. Я использовал в терминале эту версию кода: while ((c = getchar()), c! = EOF) { putchar (c); } и не смог увидеть разницу между результатами. Глупое положение. –

ответ

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. первый getchar() считывает первый входной символ времени.
  2. второй getchar() продолжает читать следующий вход (ы), до тех пор пока в EOF

Другими словами, цель while (c != EOF) должен держать на проверки, является ли это cEOF или нет. если c не изменен, то цикл while() не имеет смысла, не так ли? Второй getch() отвечает за привязку значения c на каждой итерации.

+0

Это мое невнимание. Я использовал в терминале эту версию кода: while ((c = getchar()), c! = EOF) {putchar (c);} и не видел разницы. Глупое положение. –

1

да, так что это не путчар EOF.

Он читает первый символ, проверяет, что его не EOF, затем putChars он, а затем получает еще один символ, обратно в верхнюю часть цикла while и проверяет его не EOF.

1

Второй c = getchar() должен читать еще один символ и, тем не менее, пыльник до тех пор, пока не будет встречен EOF.

0

первый c = getchar(); будет работать только один раз, но 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 
} 
0

Это потому, что в то время как цикл цикла проходит сверху, но вам действительно нужен тест посередине. Альтернативой дублированию кода над циклом и внутри него является использование break.

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

Это мое невнимание. Я был запущен в терминале эту версию кода:

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

и не мог видеть разницу между результатами. Глупое положение. Спасибо всем.

Смежные вопросы