【问题标题】:Why Is string::substr Misbehaving?为什么 string::substr 行为不端?
【发布时间】:2016-07-25 12:38:34
【问题描述】:

鉴于此代码:

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”

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

  1. “一个”
  2. “b,c”
  3. “c”

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

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

【问题讨论】:

  • 这就是调试器的用途。这是一个非常简短、简单、琐碎的算法。使用调试器单步执行代码,一次一行,每次循环。检查所有这些变量的值。看看他们指向什么。阅读std::string 方法的描述,以及每个参数应该是什么。想办法。了解如何使用调试器是每个 C++ 开发人员必备的技能。
  • substr() 的第二个参数是长度,而不是索引。
  • 可能与过去时代提出的问题重复:stackoverflow.com/q/12827030/2642059

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


【解决方案1】:

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

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

第二个参数不是结束的位置(就像&lt;algorithm&gt; 中的所有其他函数一样),它是子字符串的长度。因此,如果您以 finish 作为结尾,则需要 finish - (start + 1) 作为长度。

【讨论】:

  • tl;dr blah blah 阅读 substr() 的文档 blah blah ;)
  • @JonathanWakely 这是一次逃离文档丛林的愉快旅程。
猜你喜欢
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
相关资源
最近更新 更多