我得到如下一行:"1001", Name
我想知道如何在没有atoi
的情况下获取引号之间的数字。
问题是要使函数只获取字符串中两个引号之间的整数,然后获取名称并将其放在字符串中,但我不理解该部分。
答案 0 :(得分:2)
使用正则表达式进行搜索:
#include <regex>
#include <iostream>
int main()
{
const std::string s = "\"1001\", John Martin";
std::regex rgx("\"(\\d+)\", *([\\w ]+)"); // this will extract quoted numbers in any string
std::smatch match;
if (std::regex_search(s.begin(), s.end(), match, rgx))
std::cout << "ID: " << match[1] << ", Name: " << match[2] << '\n';
}
答案 1 :(得分:0)
看看std::istringstream
,例如:
std::string s = "\"1001\", Name";
std::string name;
int num;
std::istringstream iss(s);
iss.ignore();
iss >> num;
iss.ignore();
iss.ignore();
std::getline(iss, name);
或
std::string s = "\"1001\", Name";
std::string name;
int num;
std::istringstream iss(s);
iss.ignore(std::numeric_limits<std::streamsize>::max(), '"');
iss >> num;
iss.ignore(std::numeric_limits<std::streamsize>::max(), ',');
std::getline(iss, name);
或
std::string s = "\"1001\", Name";
std::string name;
int num;
std::string::size_type start = s.find('"') + 1;
std::string::size_type end = s.find('"', start);
std::string snum = s.substr(start, end - start);
std::istringstream(snum) >> num;
start = s.find(',', end+1) + 1;
start = s.find_first_not_of(' ', start);
name = s.substr(start);
答案 2 :(得分:0)
您还可以使用std::string
函数find
,find_first_not_of
和substr
来解析信息。
您只需沿原始字符串进行查找,找到开始引号"
,存储索引,然后找到结束引号及其索引,整数字符串是介于两者之间的字符。
接下来,您可以使用find_first_not_of
定位第一个字符而不是", \t"
(逗号,空格,制表符),并将名称作为原始字符串的其余部分。
#include <iostream>
#include <string>
int main (void) {
std::string s = "\"1001\", Name", ssint, ssname;
size_t begin, end;
begin = s.find ("\""); /* locate opening quote */
if (begin == std::string::npos) { /* validate found */
std::cerr << "error: '\"' not found.\n";
return 1;
}
end = s.find ("\"", begin + 1); /* locate closing quote */
if (end == std::string::npos) { /* validate found */
std::cerr << "error: closing '\"' not found.\n";
return 1;
}
ssint = s.substr (begin + 1, end - 1); /* int is chars between */
begin = s.find_first_not_of (", \t", end + 1); /* find not , space tab */
if (begin == std::string::npos) { /* validate found */
std::cerr << "error: no non-excluded characters found.\n";
return 1;
}
ssname = s.substr (begin); /* name is reamining chars */
std::cout << "int : " << ssint << "\nname: " << ssname << '\n';
}
(注意:始终通过确保返回的结果不是find
来验证find_first_not_of
和std::string::npos
的结果
使用/输出示例
$ ./bin/parse_str
int : 1001
name: Name
您可以在cppreference - std::basic_string上找到有关所有string
库成员函数的详细信息。