簡體   English   中英

為什么這個C程序在輸出中打印奇怪的字符?

[英]Why does this C program print weird characters in output?

我有以下程序:

#include <stdio.h>

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

無論我輸入什么,我得到:

Read  

為什么會發生這種情況,我看到的奇怪的是什么?

Stackoverflow不會打印奇怪的字符。 你可以在這里看到: http//ideone.com/EfZHr

您需要將括號括起來:

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

優先級!=比更大=

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

與:

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

讀取char將其與換行符進行比較,然后將比較結果分配給ch。 現在比較的結果是0 (輸入換行時)或1 (輸入任何其他內容時)

您看到的奇怪的char是值為1控件char ,沒有ASCII 1的可打印符號,所以我猜它的shell打印出值為0001的怪異char。

您可以通過將程序輸出傳遞給八進制轉儲(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

C(和C ++)將while循環解釋為:

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

所以ch得到值1 (對於true),這是一個不可打印的字符。 您應該使用顯式括號來修復優先級:

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

寫入此操作將導致意外行為,具體取決於語言運算符的優先級 在C =之后評估!=所以ch將為真或假。 嘗試:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM