为什么这个C程序在输出中打印奇怪的字符?

时间:2010-09-02 12:07:39

标签: c operator-precedence getchar control-characters

我有以下计划:

#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 个答案:

答案 0 :(得分:18)

您需要将括号括起来:

while( (ch = getchar()) != '\n')
!=的{​​p} Precedence大于=

的<{3}}
while( ch = getchar() != '\n')

与:

相同
while( ch = (getchar() != '\n') )
读取char的

将其与换行符进行比较,然后将比较结果分配给ch。现在,比较结果为0(输入换行符时)或1(输入其他内容时)

您看到的奇怪的字符是control char,其值为1,ASCII 1没有可打印的符号,所以我猜它的shell会打印出值为{{1的奇怪字符}} 在里面。

您可以通过将程序输出传递给八进制转储(od)来确认它:

0001

GCC与$ 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 一起使用时会警告您:

-Wall

答案 1 :(得分:2)

C(和C ++)将while循环解释为:

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

所以ch得到值1(对于true),这是一个不可打印的字符。您应该使用显式括号来修复优先级:

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

答案 2 :(得分:1)

ch = getchar() != '\n'

根据语言operator precedence,写入此内容会导致意外行为。在=之后评估!=,因此ch将为真或假。尝试:

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