当一个部分可以有空格时,如何将字符串解析为多个变量?
How to parse a string into multiple variables when one part can have spaces?
我有一个字符串需要拆分为四个变量:cmd1、cmd2、id、address。
我有这个:
string x = "ADD ADDRESS 001 21 PARKWAY DRIVE";
string cmd1, cmd2, id, address;
istringstream ss(x);
ss >> cmd1 >> cmd2 >> id >> address;
cout << cmd1 << endl << cmd2 << endl << id << endl << address;
问题是,如果地址输入中有一个 space,它只会接受输入到第一个 space,就像 stringstream 一样,那么我如何获得整个地址并将其存储到 "address"?
正在寻找这个:
INPUT: ADD ADDRESS 001 21 PARKWAY DRIVE
STORED:
cmd1 = ADD
cmd2 = ADDRESS
id = 001
address = 21 PARKWAY DRIVE
现在,我得到这个:
INPUT: ADD ADDRESS 001 21 PARKWAY DRIVE
STORED:
cmd1 = ADD
cmd2 = ADDRESS
id = 001
address = 21
除了 stringstream 之外,也许还有更好的方法来拆分字符串?
使用std::getline(ss, address)
将该行的剩余部分读入address
。您也可以先使用 ss >> std::ws
来丢弃任何前导空格。
ss >> cmd1 >> cmd2 >> id;
getline(ss, address);
address = address.substr(1, address.size());
一种方法是读取字符串直到 id:
ss >> cmd1 >> cmd2 >> id;
然后使用 getline 获取地址:
getline(ss, address);
也可以删除多余的 space 您可以使用名为 substr 的字符串函数或使用 ws:
address = address.substr(1,address.size()); or
ws(ss);
因此您的程序将如下所示:
#include <iostream>
#include <sstream>
using namespace std;
int main(){
string x = "ADD ADDRESS 001 21 PARKWAY DRIVE";
string cmd1, cmd2, id, address;
istringstream ss(x);
ss >> cmd1 >> cmd2 >> id;
ws(ss);
getline(ss, address);
cout << cmd1 << endl << cmd2 << endl << id << endl << address;
return 0;
}
您可以使用正则表达式来完成这项工作。它允许您在需要时跳过多余的空格,进行一些验证(例如只接受大写字母)等。
#include <iostream>
#include <regex>
int main() {
const std::string x = "ADD ADDRESS 001 21 PARKWAY DRIVE";
const auto regex = std::regex(R"(^(\w+)\s+(\w+)\s+(\w+)\s+(.+)$)");
std::smatch result;
if (std::regex_match(x, result, regex)) {
for (size_t i = 1; i < result.size(); ++i) {
std::cout << result[i] << std::endl;
}
}
return 0;
}
我有一个字符串需要拆分为四个变量:cmd1、cmd2、id、address。
我有这个:
string x = "ADD ADDRESS 001 21 PARKWAY DRIVE";
string cmd1, cmd2, id, address;
istringstream ss(x);
ss >> cmd1 >> cmd2 >> id >> address;
cout << cmd1 << endl << cmd2 << endl << id << endl << address;
问题是,如果地址输入中有一个 space,它只会接受输入到第一个 space,就像 stringstream 一样,那么我如何获得整个地址并将其存储到 "address"?
正在寻找这个:
INPUT: ADD ADDRESS 001 21 PARKWAY DRIVE
STORED:
cmd1 = ADD
cmd2 = ADDRESS
id = 001
address = 21 PARKWAY DRIVE
现在,我得到这个:
INPUT: ADD ADDRESS 001 21 PARKWAY DRIVE
STORED:
cmd1 = ADD
cmd2 = ADDRESS
id = 001
address = 21
除了 stringstream 之外,也许还有更好的方法来拆分字符串?
使用std::getline(ss, address)
将该行的剩余部分读入address
。您也可以先使用 ss >> std::ws
来丢弃任何前导空格。
ss >> cmd1 >> cmd2 >> id;
getline(ss, address);
address = address.substr(1, address.size());
一种方法是读取字符串直到 id:
ss >> cmd1 >> cmd2 >> id;
然后使用 getline 获取地址:
getline(ss, address);
也可以删除多余的 space 您可以使用名为 substr 的字符串函数或使用 ws:
address = address.substr(1,address.size()); or
ws(ss);
因此您的程序将如下所示:
#include <iostream>
#include <sstream>
using namespace std;
int main(){
string x = "ADD ADDRESS 001 21 PARKWAY DRIVE";
string cmd1, cmd2, id, address;
istringstream ss(x);
ss >> cmd1 >> cmd2 >> id;
ws(ss);
getline(ss, address);
cout << cmd1 << endl << cmd2 << endl << id << endl << address;
return 0;
}
您可以使用正则表达式来完成这项工作。它允许您在需要时跳过多余的空格,进行一些验证(例如只接受大写字母)等。
#include <iostream>
#include <regex>
int main() {
const std::string x = "ADD ADDRESS 001 21 PARKWAY DRIVE";
const auto regex = std::regex(R"(^(\w+)\s+(\w+)\s+(\w+)\s+(.+)$)");
std::smatch result;
if (std::regex_match(x, result, regex)) {
for (size_t i = 1; i < result.size(); ++i) {
std::cout << result[i] << std::endl;
}
}
return 0;
}