2016-01-22 82 views
1

我正在嘗試使用getchar()讀取整數。這是我正在使用的代碼:使用getchar()讀取整數

while (thisChar = getchar() != '\n') { 
    n = n * 10 + thisChar - '0'; 
} 

int n被初始化爲零,並且thisChar被聲明爲int

對於單位輸入,n被返回爲-47,這意味着爲start of heading字符值正在被閱讀。我在while表達式中分配thisChar的方式有什麼不正確嗎?

回答

5

它遺漏括號:

int thisChar; 
while ((thisChar = getchar()) != '\n') { 
    n = n * 10 + thisChar - '0'; 
} 

如果沒有這些額外的括號,你總是分配給thisChar比較getchar() != '\n'的值,即始終10 ...

請注意,您也應該處理EOF

int thisChar = getchar(); 
while (thisChar != EOF && thisChar != '\n') { 
    n = n * 10 + thisChar - '0'; 
    thisChar = getchar(); 
} 
+0

給予好評裏面。 'thisChar - '0''可以是'1 - 48',這解釋了OP的'-47'爲單個數字。 –

+0

@WeatherVane如果thischar的類型爲'int',那麼需要使用' - '0''是什麼? – roottraveller

+0

@rkm_Hodor,因爲它正在讀取數字字符'0'..'9'',它們沒有* value *。所以你減去''0'來得到整數範圍'0..9'。在ASCII(這是常見的但並不總是使用)中,數字字符「0」,「9」具有值「48..57」。 –

3

!= have hi比=運營商的優先級高。因此,表達式

while(thisChar = getchar() != '\n') {...} 

將被解析爲

while(thisChar = (getchar() != '\n')) {...} 

和比較getchar() != '\n')的結果將被分配到thisChar

你需要把子表達式thisChar = getchar()支架

while((thisChar = getchar()) != '\n') {...} 
+1

正確,但只有一個賦值運算符,因此它的關聯性無關緊要。問題是'!='具有比'='更高的優先級。 –

+0

@KeithThompson;對不起。我現在糾正了它。 – haccks