2017-04-08 95 views
0

我來自其他編程語言,我不明白爲什麼此代碼會引發錯誤。C++中的類型之間的轉換

string n = "123456"; 
int x; 

for(int i = 0; i < n.length(); i++) { 

    x = atoi(n[i].c_str()); 
    x *= 2; 
    cout << x << endl; 
} 

你能解釋我這個意外嗎?並告訴我如何正確地將其轉換爲整數?

+2

什麼是'n [i]'?它是一個'std :: string'對象嗎?你真的*讀過*錯誤信息(不管它是什麼)?也許你應該[找到一個好的初學者書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)並開始正確學習C++? –

+1

'n [i]'是一個字符。 (不是大小爲1的「字符串」)。 'char'沒有成員函數。 –

+0

目前還不清楚你到底想要達到什麼樣的目標 - 你是否想將字符串描述的整個數字轉換爲一個int(在這種情況下,你只需要使用'x = std :: stoi(n);'( [參考資料](http://en.cppreference.com/w/cpp/string/basic_string/stol))或者你想用該數字的每個數字執行一些計算? – UnholySheep

回答

4

看看return type of std::basic_string::operator[]:這是referenceconst_reference。也就是,一個(const)引用字符。在std::string的情況下,這意味着您可以參考char,而不是std::string

C++保證數字的字符值是連續的並且增加。換句話說,無論使用何種字符編碼,都可以保證'1' - '0' == 1'2' - '0' == 2等等。因此,將包含數字的char轉換爲數字值的方法就是這樣做:

x = n[i] - '0'; 
+0

如果有人想知道最終片段中的'char'整數提升,'0'減法只是將'n [i]'的ASCII值移動了'48',因爲數字的字符值開始了(並且如前所述在ASCII值爲48時(對於'0') – dfri

+0

@dfri它將'n [i]'的值移動到文字'0'的值上。 48當系統正在使用時g ASCII,但它可以是其他編碼中的其他任何內容。重點是它必須始終工作,使'1' - '0'== 1'(和其他數字相似)。 – Angew

+0

我沒有考慮非ASCII系統,謝謝澄清!上面的評論(特別是最後一句話的核心點)可能有價值地包括在我們這些沒有完全理解這一點的答案中。 – dfri