2013-03-03 97 views
-2
#include <iostream> 
#include <math.h> 
#include <iomanip> 
#include <sstream> 
#include <stdio.h> 
#include <string> 
#include <stdlib.h> 
using namespace std; 

int main() 
{ 
    ostringstream str; 
    double num = pow(2,1000); 
    int sum = 0; 

    str << setprecision(1000) << num; 
    string here = str.str(); 

    cout << here << "\n\n"; 

    /*for(int i = 0; i < here.length(); i++) 
    { 
     sum += atoi(&here[i]); 
    }*/ 

    cout << atoi(&here[0]); 
    cout << atoi(&here[1]); 
    cout << atoi(&here[2]); 
} 

輸出:的atoi()只給0結果

10715086071862673209484250490600018105614048117055336074437503883703510511249361 
22493198378815695858127594672917553146825187145285692314043598457757469857480393 
45677748242309854210746050623711418779541821530464749835819412673987675591655439 
46077062914571196477686542167660429831652624386837205668069376 

000 

爲什麼全0?

+1

我想你不想'atoi'可言,我想你想簡單地減去''0 ''(即文本數字零的字符常量)。看起來好像你想要對字符串中的每個數字進行求和。如果是這種情況,你不會希望使用'atoi'。使用'sum + = here [i] - '0';'在你的循環中 – dreamlax 2013-03-03 06:15:17

+0

思考實驗:* atoi *返回類型可以表示的最大數量是多少?第二個想法:雙精度浮點數可以表示多少個有效數字。 – Digikata 2013-03-03 06:15:39

+0

在我的系統上運行的相同程序給出了3個-1而不是3個零。就像其他人指出的那樣,我覺得這是因爲錯誤。 – Tuxdude 2013-03-03 06:17:39

回答

4

走出去的肢體,這裏假設你實際上並不想用std::atoi。如果要對字符串中的每個數字進行求和,則需要將數字字符轉換爲其數字的值。最快的方法是減去字符常量'0'。在你的循環,只需使用:

for(int i = 0; i < here.length(); i++) 
{ 
    sum += here[i] - '0'; 
} 

這是可能的,因爲減去的字符串結果,該字符表示的數值各種人物的'0'

'0' - '0' == 0 
'1' - '0' == 1 
'2' - '0' == 2 
//etc 
'9' - '0' == 9 

據我記得,在C++標準沒有強制任何特定的編碼,但它並指定該數字字符必須是連續的所以雖然上面是安全的,當該字符串僅包含數字,減法對可能出現的字符串會甩開你的結果的其它字符:

'E' - '0' == ??? 
'.' - '0' == ??? 
'+' - '0' == ??? 
4

這就是std::atoi表示錯誤的方法。在這種情況下,錯誤是數組中的數值大於最大可能的整數更大(這在技術上是未定義的行爲atoi,但您的實現顯然是把它當作任何其他錯誤)

3

atoi轉換一個字符串轉換爲整數(可能是您的平臺上的32位或64位)。

已存儲在here數量比INT_MAX大,因此atoi返回零:

成功時,該函數將返回轉換整數爲int值。如果不能執行有效的轉換,則返回零值。

編輯:實際上,甚至沒有看我自己的鏈接不夠仔細,顯然這是在這種情況下

未定義行爲上有當轉換後的值會發生什麼變化沒有標準規範超出了可表示值的範圍。

www.cplusplus.com

0

這裏[0]」返回「這裏」的第一個字符爲焦炭

'&這裏[0]' 返回的地址 '這裏[0]'。你不想要這個地址。'&'用於獲取變量的地址。

的std ::的atoi(這裏[0])返回這裏的第一個字符爲,並將其轉換爲INT ...或者假使「的atoi '處理了字符。它不 - 它處理字符數組。給它一個字符可能不會編譯。

std :: atoi(& here [0])編譯,但不是你想要的。 atoi將繼續閱讀字符,直到達到空字符。

這意味着,給定字符串 「567321」:

  • 的std ::的atoi(&這裏[0])將返回 「987654321」
  • 的std ::的atoi(&這裏1)將返回「87654321」
  • 的std ::的atoi(&這裏2)將返回 「7654321」
  • 的std ::的atoi(&這裏[3])將返回 「654321」
  • ...等等。

    for(int i = 0; i < here.length(); i++) 
    { 
        std::string subString = here.substr(i,1); //Returns a substring starting at 'i', and including 1 character 
        sum += atoi(subString.c_str()); 
    } 
    

    更好的方法是:

如果你真的想總結所有的數字,並要求使用std ::的atoi(),那麼你可以使用std::string::substr()做使用方法@dreamlax張貼...但如果你正在學習字符串和std :: atoi,學習約std :: string :: substr()是重要的知道。

如果您正在使用C++ 11,你會使用std::stoi改寫:

for(int i = 0; i < here.length(); i++) 
{ 
    std::string subString = here.substr(i,1); //Returns a substring starting at 'i', and including 1 character 
    sum += std::stoi(subString); 
}