2012-02-29 121 views
0

我有一個字符串,它實際上包含一個數字和一個字符串,用,分開,例如"12,fooBar"string(from substr)轉換爲unsigned int

我想把它分成變量,即編號爲unsigned int myNum和字符串爲std::string myStr

,我有以下剪斷代碼:

size_t pos1=value.find(','); 
std::cout << value.substr(0, pos1) << " and " 
      << (value.substr(0, pos1)).c_str() << std::endl; 

這就產生12 and 1。我在這裏錯過了什麼?第二部分中2發生了什麼?

注意:我把這個問題隔離到了代碼中。我需要c_str()將它傳遞到atoi得到unsigend int。這裏我不想打印第二部分。

更新:我實際上從levelDB Get得到字符串。如果我把一個測試字符串像我放在這裏,它的工作原理。

+0

你在那裏應該工作。 ([它適用於我](http://ideone.com/NoB87)。)請提供一個*完整的*,*最小*程序來證明問題。 http://sscce.org – 2012-02-29 14:34:00

+0

@Rob它如何工作?他的兩名隊員都使用相同的初始索引。他將永遠不會接受他輸入的字符串部分。 – Sid 2012-02-29 14:35:10

+1

@Sid,這段代碼不應該得到字符串部分。這段代碼應該產生'12和12'。請參閱OP的註釋:「我需要'c_str()'將它傳遞給'atoi'」。 – 2012-02-29 14:37:24

回答

5

發佈的代碼產生相同的子字符串:value.substr(0, pos1)。請注意,std::string::substr()不會修改對象,但會返回一個新的std::string

實施例:

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string value ="12,fooBar"; 
    unsigned int myNum; 
    std::string myStr; 

    const size_t pos1 = value.find(',');  
    if (std::string::npos != pos1) 
    { 
     myNum = atoi(value.substr(0, pos1).c_str()); 
     myStr = value.substr(pos1 + 1); 
    } 

    std::cout << myNum << " and " 
       << myStr << std::endl; 

    return 0; 
} 

輸出:

12和foobar的

編輯:

如果unsigned int然後下面的工作所需的唯一片:

unsigned int myNum = atoi(value.c_str()); 

atoi()將停在第一非數字字符(不包括可選的前置-+),在這種情況下,,

+0

感謝您的編輯。這指出了我的實際問題。我從levelDB得到的字符串在'1'和'2'之間有'''',這使得atoi失敗。感謝提示。不是我的問題的解決方案,而是我的問題的答案;) – ezdazuzena 2012-02-29 14:48:03

0

你的第二SUBSTR應當value.substr(POS1 + 1,value.length())

4

最乾淨的C++式的解決這個問題是使用一個字符串流。

#include <sstream> 
// ... 
std::string value = "12,fooBar"; 
unsigned int myNum; 
std::string myStr; 
std::stringstream myStream(value); 
myStream >> myNum; 
myStream.ignore(); 
myStream >> myStr; 
+0

使用流進行工作是最好的答案。儘管我會在一個聲明中完成它並進行測試,以確保被忽略的字符是逗號。 – 2012-02-29 15:01:20

+0

我同意你可能想檢查逗號。我也想把所有內容放在一行上。當然,您可以自由編輯該示例,或者提出如何編輯該示例的建議。 類似於: 'char separator; myStream >> myNum >>分隔符>> myStr; if(separator =='c') // ...' 這是你的意思嗎? – Agentlien 2012-02-29 15:15:14

相關問題