C ++ - find函数在子字符串上不起作用

时间:2018-06-17 19:21:04

标签: c++ c++11

我确实遇到了一个算法问题,我想用它将命令行拆分成几个子串。例如。字符串"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"

你们有一个暗示,为什么这不起作用?在我通过网络进行研究期间,我找不到合适的解释。

3 个答案:

答案 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)一遍又一遍。

  1. "Hello World -n filename".find(" ") - &gt; 5
  2. "World -n filename".find(" ") - &gt; 5再次(&#34;世界&#34;长度与&#34;你好&#34;)
  3. "World -n filename".find(" ") - &gt; 5
  4. 您可以使用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