2017-02-11 190 views
-1

我想將char轉換爲int。但是,當我使用通常的方式使用getchar()將char轉換爲int額外的數字

convertedInt = c - '0'; 

打印結果時,我得到一個額外的負數。比如這個代碼與輸入654產生輸出:

while (c != '\n'){ 
     c = getchar(); 
     convertedInt = c - '0'; 
     printf("%d\n", convertedInt); 
    } 

    //Output 
    4 
    5 
    6 
    -38 

我不認爲這有什麼用的getchar,因爲如果我只是打印字符而不轉換它,我得到預期的輸出。

+0

寫一個if語句不打印負數。 – Pbd

+1

我同意,這是一個有效的解決方案,但我不喜歡它。似乎馬虎。我想知道爲什麼會發生這種情況,如果我沒有if語句就可以阻止它。 (如果我不知道它爲什麼會出現,我怎麼知道它會是-38) – frillybob

+1

這只是因爲你的字符串有一些你不知道的額外字符! – Pbd

回答

4

您正在測試之前閱讀的字符。試試這個:

int c; 
while ((c = getchar()) != '\n' && c != EOF) { 
    convertedInt = c - '0'; 
    printf("%d\n", convertedInt); 
} 

注意getchar()可以在一個錯誤的情況下返回EOF,或者如果用戶信號EOF從鍵盤等c應該爲這個值,以避免可能的無限循環進行測試。

在問題的代碼中,似乎while語句的控制表達式測試的值是c第一次未初始化的值。這導致未定義的行爲。之後,讀取並打印最後一位數字後,再次測試c,發現不是\n。然後調用getchar()並且c的值爲10,換行符在ASCII中的十進制值。因此,convertedInt的值爲10 - 48-38。然後c進行最後一次測試;現在它等於\n,循環終止。

2

當你做getChar(),你以後檢查它爲\n,但你首先減去'0'。以此代替

while(1){ 
    c = getchar(); 
    if(c == '\n') 
     break; 
    convertedInt = c - '0'; 
    printf("%d\n", convertedInt); 
} 
3

首先,getchar返回一個int,通常在最低字節中包含一個字符代碼。它返回一個int的原因是,它必須能夠爲EOF這是從任何可能的unsigned char值不同的返回值。 EOF用於指示輸入的結束,並不意味着被視爲字符輸入。在許多系統上,EOF的值爲-1。

你所看到的值是ASCII '\n' - '0' == 10 - 48

這裏是從getchar()處理不希望的輸入的共成語:

while((c = getchar()) != EOF && c != '\n') { 
    if(c >= '0' && c <= '9') { 
     convertedInt = c - '0'; 
     printf("%d\n", convertedInt); 
    } 
} 

類似的檢查可以通過包括#include <ctype.h>和改變if語句的條件,以被if(isdigit(c))來達到的。

+0

@DavidBowling。你是絕對正確的。我在移動,所以我的更新花了很長時間來寫 –

+0

我的鍵盤不讓我把兩個空格連續,讓我們只是說, –

+0

不知道OP是否需要驗證數字或不(不是要解決問題中的問題),但這不是一個壞主意。我看到你提到'ctype.h'函數;我只想指出,通常使用這些函數比例如'c> ='0'&& ...'更好,因爲這些函數旨在提供更便攜的解決方案。 –