为啥 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;
第二个参数不是结束的位置(就像<algorithm>
中的所有其他函数一样),它是子字符串的长度。因此,如果您以 finish
作为结尾,则需要 finish - (start + 1)
作为长度。
【讨论】:
tl;dr blah blah 阅读 substr() 的文档 blah blah ;) @JonathanWakely 这是一次逃离文档丛林的愉快旅程。以上是关于为啥 string::substr 行为不端?的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionView 中的 UITableView 行为不端