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和选项。