Почему эта программа C печатает странные символы в выводе? - PullRequest
6 голосов
/ 02 сентября 2010

У меня есть следующая программа:

#include <stdio.h>

int main()
{
        int ch;
        while( ch = getchar() != '\n') {
                printf("Read %c\n",ch);
        }  
        return 0;
}

Независимо от того, что я ввожу, я получаю:

Read  

Почему это происходит и что это за странный символ, который я вижу?

Stackoverflow не печатает странный символ. Вы можете увидеть это здесь: http://ideone.com/EfZHr

Ответы [ 3 ]

18 голосов
/ 02 сентября 2010

Вам нужно поставить круглые скобки как:

while( (ch = getchar()) != '\n')

Старшинство из != больше, чем =

while( ch = getchar() != '\n')

совпадает с:

while( ch = (getchar() != '\n') )

, который читает символ, сравнивает его с символом новой строки и затем присваивает результат сравнения ch. Теперь результат сравнения равен 0 (при вводе новой строки) или 1 (при вводе чего-либо еще)

Странный символ, который вы видите, это контрольный символ со значением 1, для ASCII 1 нет печатаемого символа, поэтому я предполагаю, что это оболочка, которая печатает странный символ со значением 0001 в нем.

Вы можете подтвердить это, отправив вывод вашей программы в восьмеричный дамп (od):

$ echo 'a' | ./a.out | od -bc         # user entered 'a'
0000000 122 145 141 144 040 001 012
          R   e   a   d     001  \n
here you go  ----------------^


$ echo '\n' | ./a.out | od -bc        # user entered '\n'
0000000

GCC при использовании с -Wall предупреждает вас как:

warning: suggest parentheses around assignment used as truth value
2 голосов
/ 02 сентября 2010

C (и C ++) интерпретируют цикл while как:

while( ch = (getchar() != '\n')) {

Таким образом, ch получает значение 1 (для истины), которое является непечатаемым символом. Вы должны использовать явные скобки, чтобы исправить приоритет:

 while( (ch = getchar()) != '\n') {
1 голос
/ 02 сентября 2010
ch = getchar() != '\n'

Запись этого сообщения приведет к неожиданному поведению в зависимости от языков приоритет оператора .В C = оценивается после !=, поэтому ch будет истинным или ложным.Попробуйте:

(ch = getchar()) != '\n'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...