当一个部分可以有空格时,如何将字符串解析为多个变量?

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;
}