2012-02-29 117 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

相关问题