我有一个字符串,其实际上包含一个数字和一个字符串,以,
分隔,例如"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
获取字符串。如果我把一个像我放在这里的测试字符串,它就可以了。
答案 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(双精度等),有不同的重载。