0

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

我想将它放入单独的变量中,即数字 intounsigned int myNum和字符串 into 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()将它传递atoiunsigend int. 在这里我不想打印第二部分。

更新:我实际上是从 levelDB 得到的字符串Get。如果我像放在这里一样放一个测试字符串,它就可以工作。

4

4 回答 4

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());

asatoi()将在第一个非数字字符处停止(不包括可选的前导-+),在这种情况下为,.

于 2012-02-29T14:32:47.767 回答
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;
于 2012-02-29T14:37:15.840 回答
0

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

于 2012-02-29T14:34:02.917 回答
0

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

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(双精度等)有不同的重载。

于 2018-11-25T15:43:12.607 回答