用C++中的字符串中的NUL char

use*_*750 37 c++ string c++11

在下面的代码中,我试图用第一个字符替换'\0'.

我希望它打印一个空字符串,但在输出中它只是省略了它并显示其余的字符.

int main()
{
    string str;
    cin >> str;

    str[0] = '\0';

    cout << str << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

   testing
   esting
Run Code Online (Sandbox Code Playgroud)

如何在C++中终止字符串?

PS:我正在尝试这种方法在一个不同的问题中终止字符串,我需要在其间终止.

Mar*_*ila 51

std::string不是以空字符结尾的字符串.如果要清空它,请使用该clear()方法.如果要删除字符串的元素,请使用该erase()方法.

  • @Niall实际上,它保证不会被实现为空终止字符数组,因为`std :: string`包含一个''\ 0'`是完全合法的. (6认同)
  • @Niall事实上你可以在字符串中放置一个''\ 0',这意味着实现不能将它用作哨兵.(C++ 11确实要求内存是连续的,并且`c_str()`返回与`&str [0]`相同的东西,但是仍然不允许实现将`'\ 0'`视为终结者.) (4认同)
  • @Niall你的"不保证"语句允许`std :: string`被实现为以null结尾,但不能保证这样.James'"保证不会"语句仅允许非空终止实现,这是正确的. (3认同)
  • @Niall你说"不保证",我说它实际上是被禁止的. (2认同)

Que*_*onC 35

字符串有两种方法.

在C中,字符串是零终止的,这意味着'\ 0'表示字符串的结尾,这正是您所期望的.

C++(和大多数语言)使用计数字符串,这意味着字符串的结尾被索引,因此向字符串添加空终止符不会终止它.'\ 0'是非打印字符,因此当您打印时,您会看到您所看到的行为.如果要操作std :: string长度,则需要使用std :: string方法(http://www.cplusplus.com/reference/string/string/).

C++不关心字符串的null终止符.它们仅用于C兼容性.

顺便说一句,这应该具有您期望的行为.

cout<<str.c_str()<<"\n";
Run Code Online (Sandbox Code Playgroud)

也可以看看

为什么以null结尾的字符串?或者:以空值终止与字符+长度存储

null终止字符串的基本原理是什么?


Joh*_*ell 14

你以为你有

testing
esting
Run Code Online (Sandbox Code Playgroud)

作为输出,但你实际上得到了

testing
 esting
^
|
+-- "empty" \0 char
Run Code Online (Sandbox Code Playgroud)

因为std::string仍然有"测试"的长度,你只需用'\ 0'替换第一个字符't'.当std::cout获得字符串,它看起来在字符串长度,并输出它的所有字符,这使得"\ 0"导致输出一个"空"插槽.

要真正清除字符串,请更喜欢打电话std::string::clear().同样有效std::string::reset(0),但它不具有表现力(你甚至可以指定一个空字符串......不寒而栗).实现可能会或可能不会使用'\ 0',所以不要认为这是一种摆弄外部观察表示的方法.


101*_*010 10

一个std::string类似于a的功能std::vector.如果你想删除std::string你可以使用的所有元素std::string::clear

#include <iostream>
#include <string>

int main() {
  std::string str("testing");
  std::cout << str << std::endl;
  str.clear();
  std::cout << str << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如果你想删除字符串中的特定字符(例如,第一个字符),你可以使用std::string::erase:

#include <iostream>
#include <string>

int main() {
  std::string str("testing");
  std::cout << str << std::endl;
  str.erase(str.begin());
  std::cout << str << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如果你想删除你的字符串中的特定字符,你可以std::vector使用erase-remove成语:

#include <iostream>
#include <string>
#include <algorithm>

int main() {
  std::string str("testing");
  std::cout << str << std::endl;
  str.erase(std::remove_if(str.begin(), str.end(), [](char const &c){ return c == 't'; }), str.end());
  std::cout << str << std::endl;
}
Run Code Online (Sandbox Code Playgroud)