首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串迭代器永远不会到达std:: String ::end()

字符串迭代器永远不会到达std:: String ::end()
EN

Stack Overflow用户
提问于 2019-09-15 18:24:46
回答 2查看 59关注 0票数 0

当使用const迭代器遍历字符串时,它永远不会结束。在遍历过程中,字符串从未被修改过。但是itr永远不会到达src.cend()。最后,程序崩溃了。

此功能是将域名转换为用于DNS查询的标准域名。例如,www.abc.com被转换为3www3abc3com

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-15 18:28:25

您的代码将结束字符串。

当您在字符串中找到最后一个'.',并且外部循环迭代时,您的内环将以itr == src.cend()结束。然后,您将增加迭代器(这是错误的),外部循环条件将不再为真。

如果外部循环不等于++itr,则只应该在外部循环中执行src.cend()

票数 3
EN

Stack Overflow用户

发布于 2019-09-15 19:19:58

我建议使用std::string::find()而不是手动搜索循环:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57947032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档