2011-11-04 147 views
0
//sLine is the string 
for(int l = 0; l < sLine.length(); l++) 
{ 
    string sNumber; 
    if(sLine[l] == '-') 
    { 
     sNumber.push_back(sLine[l]); 
     sNumber.push_back(sLine[l + 1]); 
     l++; 
    } 
    else if(sLine[l] != '\t') 
    { 
     sNumber.push_back(sLine[l]); 
    } 
    const char* testing = sNumber.c_str(); 
    int num = atoi(testing); 
    cout << num; 
} 

我有這個for-loop,它檢查字符串的每個字符並將此字符串中的每個數字轉換爲int。但由於某種原因,atoi函數做了兩次,所以當我關閉它時,它會出於某種原因顯示它兩次......爲什麼?C++將字符串轉換爲int

例如: INPUT 3 3 -3 9 5
-8 -2 9 7 1
-7 8 4 4 -8
-9 -9 -1 -4 -8

OUTPUT 3030-309050 -80-20907010
-70804040-80
-90-90-10-40-80

+3

'sNumber.push_back(sLine [l + 1]);'可以超出字符串結束。 – Vlad

+0

@Vlad但我已經把那裏,因爲負數... – Danny

+0

它執行整個循環兩次。 –

回答

10

它顯示所有nonrecognized字符的零,因爲atoi回報0給出一個非數字字符串時

但是,你想要做什麼,是令人震驚的簡單:

std::stringstream ss(sLine); 
int num; 
while(ss >> num) { 
    cout << num; 
} 
0

移動這樣的:

const char* testing = sNumber.c_str(); 
int num = atoi(testing); 
cout << num; 

低於您粘貼的代碼中的最後一個},即超出for-loop。目前,您在sLine中爲每個字符分別打印輸出,因爲它在循環的每次迭代中都執行。 (在sLine的最後一個字符可能是一個換行符所以,即使你認爲你只寫了一個數字可能出現這種情況。)

編輯:亦動上述 for循環的sNumber聲明。

您可能還希望將if (sLine[l] == '-')更改爲if (sLine[l] == '-' && (l + 1) < sLine.length()),因此如果連字符是最後一個字符,則不會訪問超出字符串的末尾。

您可能還想將變量l重命名爲看起來不像1的東西。 =)

您可能還需要重新考慮,如果這是在所有做到這一點(通常,如果一個簡單的事情變得複雜,這種正確的方式,那麼你就錯了)。 (!就像一個空格)

+0

sNumber會超出範圍 –

+0

注意和編輯,謝謝。 – Arkku

0

您爲非數字字符輸出額外0。問題是atoi在無法轉換輸入時返回0,因此您的空格被打印爲零。

0

這似乎是一個痛苦的方式來重新創建輪子。你最好用stringstream來解析這個。

std::stringstream strm(sLine); 
int num; 
while(strm >> num) 
{ 
    std::cout << num << std::endl; 
} 
+3

請不要鼓勵使用'eof()'或'fail()'作爲循環條件。這樣做幾乎總是會導致錯誤的代碼。而不是'while(strm >> num){...}'。爲了演示'eof()'的邪惡力量:http://ideone.com/ZKa67 –

+0

@Rob感謝您的演示。將編輯答案。 – Jon