为啥 string::substr 行为不端?

Posted

技术标签:

【中文标题】为啥 string::substr 行为不端?【英文标题】: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 包含:

    “一个” “b” “c”

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

    “一个” “b,c” “c”

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

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

【问题讨论】:

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

以上是关于为啥 string::substr 行为不端?的主要内容,如果未能解决你的问题,请参考以下文章

markdown 不当行为行为不端

百科知识 学位论文学术不端行为检测系统简介

行为不端的积分函数

UICollectionView 中的 UITableView 行为不端

Flex 4.6 TextInput 提示 ios 行为不端

连接两个具有间隔的数据帧行为不端?