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

How to parse a string into multiple variables when one part can have spaces?

本文关键字:字符串 变量 空格 一个      更新时间:2023-10-16

我有一个字符串,我需要把它分成四个变量: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;

问题是,如果地址输入中有一个空格,它将只接受输入到第一个空格,就像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,以这种方式分割字符串?

一种方法是读取字符串直到id:

ss >> cmd1 >> cmd2 >> id;

,然后使用getline for address:

getline(ss, address);

还可以使用一个名为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;
}

使用std::getline(ss, address)将该行的剩余部分读入address。您也可以先使用ss >> std::ws,以丢弃任何前导空格。

ss >> cmd1 >> cmd2 >> id;
getline(ss, address);
address = address.substr(1, address.size());