C++ 如何将stringstream拆分为带有两种分隔符(空格和引号)的向量

C++ 如何将stringstream拆分为带有两种分隔符(空格和引号)的向量,c++,C++,有人能帮忙把字符串流拆分成向量吗 我有一个早期的实现,看起来像: int main() { string console_cmd; std::vector<string> cmdList; cout << ">> "; getline(cin, console_cmd); istringstream iss(console_cmd); copy(istream_iterator<s

有人能帮忙把字符串流拆分成向量吗

我有一个早期的实现,看起来像:

int main()
{
    string console_cmd;
    std::vector<string> cmdList;

    cout << ">> ";
    getline(cin, console_cmd);

    istringstream iss(console_cmd);

    copy(istream_iterator<string>(iss),
        istream_iterator<string>(),
        back_inserter(cmdList));

    return 0;
}
所以向量列表将包含

cmdList[0] = check
cmdList[1] = -file
cmdList[2] = /folder/filename.txt
后来,我遇到了目录的问题,特别是带有空格的目录。例如:

>> check -file /folder name/filename.txt
其输出如下所示:

cmdList[0] = check
cmdList[1] = -file
cmdList[2] = /folder
cmdList[3] = name/filename.txt
cmdList[0] = check
cmdList[1] = -file
cmdList[2] = /folder name/filename.txt
我希望它看起来像这样:

cmdList[0] = check
cmdList[1] = -file
cmdList[2] = /folder
cmdList[3] = name/filename.txt
cmdList[0] = check
cmdList[1] = -file
cmdList[2] = /folder name/filename.txt
我曾考虑使用分隔符,但我不确定如何实现这一点

编辑:添加如何使用分隔符

>> check -file "/folder name/filename.txt"

谢谢你的帮助

如果您要求用户引用文件名或使用转义序列(如果其中包含空格),则可以通过一些解析来完成。引用:
check-file//foldername/filename.txt”
Escape-seq:
check-file/folder\name/filename.txt
,但有时很棘手。特别是如果引用字符也可能是文件名的一部分。您是否总是使用以
“/”开头的绝对路径?如果是这样,您可以使用
console\u cmd.find()
(或
.find\u first\u of()
)成员函数来定位标记文件名开头的第一个
“/”
。@TEDLYGMO Yes对我来说相当棘手。@DavidC.Rankin关于abl=olute路径,并不总是这样。有时,它可以以“C:/user/foldername/…”开头。因此,我考虑使用双引号(“)作为分隔符。不过,我不确定如何实现。使用
getline()
可以在输入中保留双引号。因此,可以使用
console\u cmd.find()
console\u cmd.find\u first\u of()
获取第一个双引号的索引,然后使用
。查找()
查找最后一个并提取中间的子字符串。请参阅:然后,您可以提取第一个双引号之前的内容,并生成一个
stringstream
并从中解析cmd和选项。如果您要求用户引用文件名或使用转义序列(如果其中包含空格),则可以通过一些解析来完成。Quoting:
check-file”/folder name/filename.txt“
Escape-seq:
check-file/folder\name/filename.txt
但有时这很棘手。特别是如果引用字符也可能是文件名的一部分。您是否总是使用以
'/'
开头的绝对路径?如果是这样,您可以使用
控制台\u cmd.find()
(或
.find_first_of()
)成员函数来定位第一个标记文件名开头的
“/”
。@TedLyngmo是的,对我来说相当棘手。@DavidC.Rankin关于abl=olute路径,并不总是如此。有时,它可以以“C:/user/folder name/…”开头。因此我考虑使用双引号(“)作为分隔符。虽然,我不确定如何实现。使用
getline()
可以在输入中保留双引号。因此,您可以使用
console\u cmd.find()
console\u cmd.find\u first\u of()
获取第一个双引号的索引,然后使用
.find\u lasr\u of())
查找最后一个并提取中间的子字符串。请参阅:然后,您可以提取第一个双引号之前的内容,生成
stringstream
,并从中解析cmd和选项。