为什么string :: substr行为不端?

时间:2016-07-25 12:38:34

标签: c++ string visual-studio gcc substr

鉴于此代码:

auto str = "a,b,c"s;
vector<string> tokens;
string::size_type start = -1;
string::size_type finish = str.find(',');

do {
    tokens.push_back(str.substr(start + 1, finish));
    start = finish;
    finish = str.find(',', start + 1);
} while (start != string::npos);

我希望tokens包含:

  1. “一”
  2. “B”
  3. “C”
  4. 当我运行代码时,我得到:

    1. “一”
    2. “B,C”
    3. “C”
    4. 我已在此实例中打印出调试信息:http://ideone.com/fx3uC9

      这是一个错误吗?我在gcc和Visual Studio中看到它,所以看起来我做错了。

1 个答案:

答案 0 :(得分:3)

如果您阅读substr()的文档,则签名为:

basic_string substr( size_type pos = 0,
                     size_type count = npos ) const;

第二个参数不是结尾的位置(就像<algorithm>中的每个其他函数都采用一个范围),它是子字符串的长度。因此,如果您将finish作为结尾,则需要finish - (start + 1)作为长度。