我确实遇到了一个算法问题,我想用它将命令行拆分成几个子串。例如。字符串"Hello World -n filename"
应切成"Hello"
"World"
和"-n filename"
。
这是我的整个代码示例:
string hello = "Hello World -n filename";
uint64_t startIndex = 0;
uint64_t endIndex = hello.length() - 1;
while(startIndex < endIndex) {
uint64_t nextWhiteSpaceIndex;
string value;
if(hello.at(startIndex) != '-') {
nextWhiteSpaceIndex = hello.substr(startIndex).find(" ");
value = hello.substr(startIndex, nextWhiteSpaceIndex);
cout << value << endl;
} else {
nextWhiteSpaceIndex = hello.substr(hello.substr(startIndex).find(" ")).find(" ");
value = hello.substr(startIndex, nextWhiteSpaceIndex);
cout << value << endl;
}
startIndex = nextWhiteSpaceIndex + 1;
}
我确实遇到了这个命令的问题:
nextWhiteSpaceIndex = hello.substr(startIndex).find(" ");
这是在while循环中,它看起来像......
.substr(startIndex)
...部分被完全忽略。第一个循环运行正常,但在第二个/下一个nextWhiteSpaceIndex没有得到正确的下一个索引。它始终打印"Hello" "World" "World" "World" "World"
并继续打印"World"
。
你们有一个暗示,为什么这不起作用?在我通过网络进行研究期间,我找不到合适的解释。
答案 0 :(得分:2)
你能做点什么吗
#include <sstream>
#include <stdio>
#include <vector>
using namespace std;
int main ()
{
string hello = "Hello World -n filename";
stringstream ss (hello);
vector<string> v;
string s, t;
while (ss >> s)
{
if (s[0] == '-')
{
ss >> t;
v.push_back (s + " " + t);
}
else
v.push_back (s);
}
for (auto i : v)
clog << i << endl;
return 0;
}
产生
$ ./a.out
Hello
World
-n filename
答案 1 :(得分:2)
如果您输出nextWhiteSpaceIndex
的值,您将始终看到:5,5,5,5 ......这是一个相对于startIndex
的索引,所以只需将最后一行更改为{{1可能会快速解决问题。
(你不是在拍摄太多的子串吗?startIndex += nextWhiteSpaceIndex + 1;
可以将搜索开始索引作为参数,这样你就可以在相同的缓冲区上执行整个搜索。)
答案 2 :(得分:2)
hello
永远不会更改,但您只在其中的一部分find
上使用substr
,然后在整个字符串上调用substr(startIndex)
( hello
)一遍又一遍。
"Hello World -n filename".find(" ")
- &gt; 5 "World -n filename".find(" ")
- &gt; 5再次(&#34;世界&#34;长度与&#34;你好&#34;)"World -n filename".find(" ")
- &gt; 5 您可以使用std::string::find
的第二个参数(size_type pos
)来指定开始偏移的位置,从而创建更少的临时字符串:
#include <iostream>
using namespace std;
int main() {
const string hello = "Hello World -n filename";
size_t startIndex = 0, pos = 0;
bool eat = true;
while(true) {
pos = hello.find('\x20', pos);
if(pos == string::npos) {
cout << hello.substr(startIndex) << endl;
break;
}
else if(eat && hello[startIndex] == '-') {
eat = false;
++pos;
continue;
}
cout << hello.substr(startIndex, pos - startIndex) << endl;
startIndex = ++pos;
eat = true;
}
return 0;
}
输出:
$ c++ main.cpp && ./a.out
Hello
World
-n filename