我有像“yx-name”这样的字符串,其中y和x是从0到100的数字。从这个字符串中,将“x”提取到C++中的整数变量中的最佳方法是什么。
问问题
4620 次
4 回答
1
您可以将字符串拆分.
并直接将其转换为整数类型。while 循环中的第二个数字是您想要的数字,请参见示例代码:
template<typename T>
T stringToDecimal(const string& s)
{
T t = T();
std::stringstream ss(s);
ss >> t;
return t;
}
int func()
{
string s("100.3-name");
std::vector<int> v;
std::stringstream ss(s);
string line;
while(std::getline(ss, line, '.'))
{
v.push_back(stringToDecimal<int>(line));
}
std::cout << v.back() << std::endl;
}
它将输出:3
于 2013-07-22T10:18:18.487 回答
0
您可以使用boost::lexical_cast来实现它,它利用了 billz 回答中的流:伪代码看起来像这样(该示例中的索引可能是错误的):
std::string yxString = "56.74-name";
size_t xStart = yxString.find(".") + 1;
size_t xLength = yxString.find("-") - xStart;
int x = boost::lexical_cast<int>( yxString + xStart, xLength );
解析错误可以通过 lexical_cast 抛出的异常来处理。对于更灵活/强大的文本匹配,我建议boost::regex。
于 2013-07-22T10:50:05.787 回答
0
使用两次调用unsigned long strtoul( const char *str, char **str_end, int base )
,例如:
#include <cstdlib>
#include <iostream>
using namespace std;
int main(){
char const * s = "1.99-name";
char *endp;
unsigned long l1 = strtoul(s,&endp,10);
if (endp == s || *endp != '.') {
cerr << "Bad parse" << endl;
return EXIT_FAILURE;
}
s = endp + 1;
unsigned long l2 = strtoul(s,&endp,10);
if (endp == s || *endp != '-') {
cerr << "Bad parse" << endl;
return EXIT_FAILURE;
}
cout << "num 1 = " << l1 << "; num 2 = " << l2 << endl;
return EXIT_FAILURE;
}
于 2013-07-22T10:15:12.990 回答
0
看来这个线程有一个类似于你的问题,它可能会有所帮助;)
于 2013-07-22T10:14:07.387 回答