为什么string::substr行为不端

Why Is string::substr Misbehaving?

本文关键字:行为不端 substr 为什么 string      更新时间:2023-10-16

给定此代码:

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. "a"
  2. "b"
  3. "c"

当我运行代码时,我得到:

  1. "a"
  2. b,c
  3. "c"

我在这个实际示例中打印出了调试信息:http://ideone.com/fx3uC9

这是个虫子吗?我在gcc和Visual Studio中看到了它,所以这似乎是我做错了什么。

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

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

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