Why does this C program print weird characters in output?

后端 未结 3 1753
一向
一向 2021-01-12 20:52

I\'ve the following program:

#include 

int main()
{
        int ch;
        while( ch = getchar() != \'\\n\') {
                printf(\"Read         


        
相关标签:
3条回答
  • 2021-01-12 21:32

    You need to place parenthesis as:

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

    Precedence of != is greater than that of =

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

    is same as:

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

    which reads a char compares it with newline and then assigns the result of comparison to ch. Now the result of comparison is 0 (when newline is entered) or 1 (when anything else is entered)

    The weird char you're seeing is the control char with value 1, there is no printable symbol for ASCII 1, so I guess its the shell that prints the weird char with value 0001 in it.

    You can confirm it by piping your program output to octal dump (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 when used with -Wall warns you as:

    warning: suggest parentheses around assignment used as truth value
    
    0 讨论(0)
  • 2021-01-12 21:36
    ch = getchar() != '\n'
    

    Writing this will cause unexpected behavior depending on the languages operator precedence. In C = is evaluated after != so ch will be true or false. Try:

    (ch = getchar()) != '\n'
    
    0 讨论(0)
  • 2021-01-12 21:38

    C (and C++) interpret the while loop as:

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

    So ch gets the value 1 (for true), which is an unprintable character. You should use explicit parenthesis to fix the precedence:

     while( (ch = getchar()) != '\n') {
    
    0 讨论(0)
提交回复
热议问题