2013-03-20 313 views
4
#include <iostream> // cin, cout 
using namespace std; 
int main(void) 
{ 
char c[80]; 
int i, sum=0; 
cin.getline(c,80); 
for(i=0; c[i]; i++) // c[i] != '\0' 
if('0'<=c[i] && c[i]<='9') sum += c[i]-'0'; 
cout<< "Sum of digits = " << sum << endl; 
getchar(); 
getchar(); 
return 0; 
} 

我明白一切接受總和+ = c [i] - '0';我刪除了「-'0'」,但沒有給我正確的答案。爲什麼是這樣?有人可以解釋「 - '0'」

+4

看看ASCII表格,你會發現一些有用的東西。 – billz 2013-03-20 09:35:32

+0

我不會說這是http://stackoverflow.com/questions/11098626/understanding-c-0的確切副本。那個是關於''a' - '0'的,這大部分都是無意義的巧合,並且是與字符集相關的。這個問題是關於從「0」減去「0」,我相信它是明確定義的。現在,其中一些解釋通常適用於這一個,但他們是不同的問題。 – jamesdlin 2013-03-20 10:25:31

回答

10

這將字符從其字符代碼(例如,在ASCII中是48)轉換爲其整數等效字符。因此它將字符'0'變成整數值0。正如Pete Becker在C和C++語言定義中的評論中指出的那樣,所有數字字符都是連續的。

+0

哇,這麼多非常詳細的**錯誤**答案! ''(如果問題沒有被關閉,我會發布這個答案)它與ASCII無關(好吧,不是直接的)。 C和C++語言定義**要求**''''''''''具有連續和遞增的值。這使'ch''0''工作;否則就沒有簡單,理智的機制可以將表示數字的字符轉換爲它們表示的值。它適用於**每個有效的字符編碼,而不僅僅是ASCII。 – 2013-03-20 11:22:47

1

'0'返回ASCII值爲0.因此,要使用數字而不是它們的ASCII值,您需要通過0的ASCII值進行偏移。 '1' - '0':: = 49 - 48 :: = 1(49和48分別是1和0的ASCII值)。

0

它的字符轉換爲整數值:

character | ASCII code | expression | equivalent | result 
    '0'  |  48  | '0' - '0' | 48 - 48 | 0 
    '1'  |  49  | '1' - '0' | 49 - 48 | 1 
    '2'  |  50  | '2' - '0' | 50 - 48 | 2 
    '3'  |  51  | '3' - '0' | 51 - 48 | 3 
    '4'  |  52  | '4' - '0' | 52 - 48 | 4 
    '5'  |  53  | '5' - '0' | 53 - 48 | 5 
    '6'  |  54  | '6' - '0' | 54 - 48 | 6 
    '7'  |  55  | '7' - '0' | 55 - 48 | 7 
    '8'  |  56  | '8' - '0' | 56 - 48 | 8 
    '9'  |  57  | '9' - '0' | 57 - 48 | 9 
1

爲0的ASCII值是48,對於其1 49等。現在在你的程序c[80]是一個字符數組。因此,如果您從鍵盤輸入1,編譯器會將其視爲算術運算的49(ascii值)。這就是爲什麼我們需要減去0的ascii值(即48)來獲得等效的整數。這可以通過從角色中減去'0'或者直接減去48來實現。 例如如果你用sum += c[i]-48;代替sum += c[i]-'0';,代碼也可以工作。但這不是一個好的做法。希望這可以幫助。