2015-07-11 105 views
0

我遇到了一個問題,不知道它爲什麼發生。基本上我有一個討厭的函數,它解析一個文本文件並返回所需參數名稱後存儲在一行中的多個值的下一個條目。它的工作原理,我不認爲有必要發佈其代碼。但問題是:在一個循環中我想用一個襯墊)從的atoi(返回一個整數值賦值給一個變量:函數返回string.c_str()作爲atoi()意外行爲的參數

for (...) 
{ 
    int fieldId = atoi(fileParser.getNextValueOfParameter("fieldIdArray").c_str()); 
    std::cout << fieldId << " "; 
} 

不幸的是分配給第一個值fieldId期間變量第一輪循環總是。剩下的值分配正確。

但是,不是一個班輪分配當我使用字符串來存儲我的解析函數返回的文本,然後單獨進行轉換後的數字值分配給 INT - 一切完美:

for (...) 
{ 
    std::string fieldIdString = fileParser.getNextValueOfParameter("fieldIdArray"); 
    int fieldId = atoi(fieldIdString.c_str()); 
    std::cout << fieldId << " "; 
} 

所有值都對應於存儲在我的文件中的實際文本編號。在第一次循環傳遞期間沒有分配的值。

這兩個代碼僅在使用臨時變量來存儲文本的一個問題是不同的,將其轉換爲 .c_str()內部的atoi(),作爲它的參數之前。

爲什麼會發生? 如果這很重要,我正在使用TDM-GCC 4.7.1 32位編譯器。

+1

? –

+0

@JonathonReinhart,因爲有了這個錯誤的編譯器版本,我不能使用_std :: stoi_,我想要一個快速的解決方法,它是_atoi()_,我希望它能夠工作。 – wowowo

+1

getNextValueOfParameter的返回類型是什麼?分成兩行會做兩件事:(1)它延長了返回值的生命週期,並且(2)如果返回值是一個引用,它會複製返回值。 –

回答

0

atoi基本上將一個數字的字符串轉換爲整數1,無論它將進行轉換,它將成爲它的返回值。或者更精確的atoi函數從字符串的開頭開始檢查。如果它有數字(僅從開始),那麼它將返回整數值。下面的例子將清除概念例如

atoi("1234") 
--> it will convert string "1234" in to integer and return it 
--> i.e. ouput is 1234 
atoi("1234abcd") --> i.e. ouput is 1234 
atoi("a1234abcd") --> i.e. ouput is 0 

所以,如果你的字符串包含字符首先那麼整數,它會給weired輸出。還可以閱讀http://www.cplusplus.com/reference/cstdlib/atoi/

+0

_fieldIdString_的內容始終是一組數字字符。我提供了一個例子,其中所有東西都按照它應該的方式工作,但是它使用了一個額外的臨時_string_變量賦值,然後將其作爲_c_str()_傳遞給_atoi()_,我不明白它爲什麼不能作爲一個當我的_string_返回函數和轉換爲_c_str()_時,它們都被計算爲_atoi()_參數。 – wowowo

0

你應該你爲什麼要使用C++程序`atoi`在C++

int fieldId = atoi(fieldIdString.c_str()); 

更改爲

int fieldId = std::stoi(fieldIdString); 

int fieldId = std::stoi(fileParser.getNextValueOfParameter("fieldIdArray"));