【问题标题】:What happens to null character when string is reversed using reverse loop使用反向循环反转字符串时空字符会发生什么
【发布时间】:2017-09-27 07:40:30
【问题描述】:

我是 C++ 字符串的新手。我只是对下面代码的工作感到困惑(用于反转字符串)。

std:: string    rev;

        for(int i=  str.size()-1;   i>=0;   --i)
        {
            rev.push_back(str[i]);  
        }

        std:: cout<<"   Reversed=   "<<rev<<endl;

问题是字符串的最后一个字符是空字符'\0'。因此,当循环运行第一次迭代时,它应该在 rev 的开头放置一个空字符,还有一件事,这里的字符串 rev 可能不是空终止的,因为 '\0' 没有分配为最后一个字符串的字符。

但是当我执行程序时,它工作正常。我知道我在思考这一切时错了。谁能解释一下工作?我会很高兴并感谢你:)

【问题讨论】:

  • 提示:你可以用这行代码大大简化代码:std::reverse_copy(begin(str), end(str), std::back_inserter(rev));
  • 谢谢@ChristianHackl

标签: c++ string loops null-character


【解决方案1】:

空终止符实际上不被视为std::string 的一部分。只有当您致电c_str() 时,它才会发挥作用。所以size()length() 不包括终止符。事实上,你可以将空字符放在std::string 的中间,除了c_str() (如果你的字符串可能包含空值,你应该使用data()size())之外,一切仍然有效。

【讨论】:

  • 如果字符串包含空值,那么 OP 很有可能实际上正在寻找 std::vector&lt;unsigned char&gt;
【解决方案2】:

'/0' 运算符是自动添加的,因此您只循环到 '/0' 之前的字符。它基本上总是在那里,所以你看不到任何变化。

【讨论】:

  • '\0',不是运算符。
猜你喜欢
  • 1970-01-01
  • 2017-04-13
  • 2016-03-17
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 2021-10-28
相关资源
最近更新 更多