当使用const迭代器遍历字符串时,它永远不会结束。在遍历过程中,字符串从未被修改过。但是itr永远不会到达src.cend()。最后,程序崩溃了。
此功能是将域名转换为用于DNS查询的标准域名。例如,www.abc.com被转换为3www3abc3com。
string name_hton(const string &src) {
string dst;
auto itr = src.cbegin(), last = itr;
do {
while (itr != src.cend() && *itr != '.') {
++itr;
}
auto diff = itr - last;
// Push the label length
dst.push_back(diff);
// Push the label
dst.append(last, itr);
++itr;
last = itr;
} while (itr != src.cend());
return dst;
}发布于 2019-09-15 18:28:25
您的代码将结束字符串。
当您在字符串中找到最后一个'.',并且外部循环迭代时,您的内环将以itr == src.cend()结束。然后,您将增加迭代器(这是错误的),外部循环条件将不再为真。
如果外部循环不等于++itr,则只应该在外部循环中执行src.cend()。
发布于 2019-09-15 19:19:58
我建议使用std::string::find()而不是手动搜索循环:
string name_hton(const string &src) {
string dst;
auto idx = src.find('.'), last = 0, diff;
while (idx != string::npos) {
diff = idx - last;
dst.push_back(static_cast<char>(diff));
dst.append(src, last, diff);
last = idx + 1;
idx = src.find('.', last);
}
diff = src.size() - last;
dst.push_back(static_cast<char>(diff));
dst.append(src, last, diff);
return dst;
}https://stackoverflow.com/questions/57947032
复制相似问题