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

时间:2014-06-27 13:32:11

标签: c++ string c++11

在下面的代码中,我尝试将第一个字符替换为'\0'

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

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

    str[0] = '\0';

    cout << str << "\n";
    return 0;
}

输出:

   testing
   esting

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

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

7 个答案:

答案 0 :(得分:50)

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

答案 1 :(得分:34)

字符串有两种方法。

在C中,字符串是零终止的,这意味着&#39; \ 0&#39;表示字符串的结尾,这是您所期望的。

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

C ++并不关心字符串的空终止符。它们仅用于C兼容性。

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

cout<<str.c_str()<<"\n";

另见

Why null-terminated strings? Or: null-terminated vs. characters + length storage

What's the rationale for null terminated strings?

答案 2 :(得分:14)

你只是觉得你有

testing
esting

作为输出,但你确实得到了

testing
 esting
^
|
+-- "empty" \0 char

因为std::string的长度仍为&#34;测试&#34;,您只需更换第一个字符&#39; t&#39;与&#39; \ 0&#39;。当std::cout获取字符串时,它会查看字符串 length 并输出其所有字符,从而使&#39; \ 0&#39;导致&#34;空&#34;输出中的插槽。

要真正清除字符串,请更喜欢致电std::string::clear()。同样有效的是std::string::reset(0),但它并不具有表现力(你甚至可以分配一个空字符串......不寒而栗)。实施可能会也可能不会使用&#39; \ 0&#39;完全没有,所以不要把它当作摆弄外部观察表现的一种方式。

答案 3 :(得分:10)

std::string几乎与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;
}

如果您想从字符串中删除特定字符(例如,第一个字符),您可以使用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;
}

如果你想删除字符串中的特定字符,就像std::vector一样,请使用擦除删除习语:

#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;
}

答案 4 :(得分:4)

根据std :: string实现,[]返回内部char数组中给定位置的字符的引用。当你设置为str [8] ='\ 0'时,它会设置。您可以通过调用str.c_str()函数来检查它。它返回内部数组。

然而, cout读取中间没有空字符的字符。这是输出的原因。

const_reference operator[](size_type __n) const
{
    return *(_M_start + __n);
}

reference operator[](size_type __n)
{
    return *(_M_start + __n);
}

答案 5 :(得分:4)

要获取以第一个字符结尾的字符串,您需要首先通过调用方法char const*string中提取string::c_str()。然后它将按您的意愿处理(如在C中)。

答案 6 :(得分:3)

也许使用像printf("%s", str.c_str());这样的好旧的printf,这将打印出C样式,并应终止于null字符。像strlen(str.c_str());这样的东西也应该有用。我怀疑是因为C ++字符串在某处有一个.size()函数,它可能有一个int size;成员,所以每次要打印时都不会浪费任何时间检查空字符。他们可能只是说打印str.size()字符。