string(from substr)转换为unsigned int

时间:2012-02-29 14:26:57

标签: c++ string std substr leveldb

我有一个字符串,其实际上包含一个数字和一个字符串,以,分隔,例如"12,fooBar"

我想将它放入分开的变量中,即将数字转换为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获取字符串。如果我把一个像我放在这里的测试字符串,它就可以了。

4 个答案:

答案 0 :(得分: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()将停在第一个非数字字符(不包括可选的前导-+),在这种情况下为,

答案 1 :(得分:3)

解决此问题的最干净的C ++风格解决方案是使用字符串流。

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

答案 2 :(得分:0)

你的第二个substr应该是value.substr(pos1 + 1,value.length())

答案 3 :(得分:0)

另一个选择是使用第17个标准中的std::from_chars函数(标头):

int x;
from_chars(&s[i], &s.back(), x); // starting from character at index i parse
                                // the nearest interger till the second char pointer

对于不同类型的值x(双精度等),有不同的重载。