为什么C ++字符串需要\ 0?

时间:2014-11-05 00:53:16

标签: c++ string

我希望我能得到进一步的解释。有人告诉我,我需要在字符串的末尾显式添加\0。显然这是针对C ++字符串类的,它实际上是一个似乎在引擎盖下解析的字符数组。我被告知必须使用\ 0才能告诉字符串的结尾如下所示:

int main()
{
  char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
  cout << str << endl;

  return 0;
}

但是,如果我有一个用户输入他们的名字,例如,我不相信C ++会自动使用\ 0来终止字符串。因此,\ 0必须在那里知道字符串结束的位置的论点是没有意义的。为什么我们不能使用.length()函数来计算字符串的长度?

我编写了以下程序来说明可以从.length()函数中找到输入的长度。

int main()
{
    string firstName;

    cout << "Enter your first name: ";
    cin  >> firstName;
    cout << "First Name = " << firstName << endl;
    cout << "String Length = " << firstName.length() << endl;

    return 0;
}

因此,如果用户输入名称“Tom”。然后输出如下:

First Name = Tom
String Length = 3

我把它带给了我教授的注意,还有这篇文章http://www.cplusplus.com/reference/string/string/length/ 我被告知这就是为什么我在大学,因为这不可能这样做。任何人都可以提供任何见解,因为我不明白我错过了什么?

3 个答案:

答案 0 :(得分:2)

C语言从C ++中采用了“C字符串”。 C语言没有string类型。 C中的字符串表示为char的数组,字符串以NUL字节(\0)终止。 C ++中的普通字符串文字仍然具有这些语义。

正如您所说,C ++ string类型维护对象内的长度,因此在string中,不需要NUL。要从string获取“C字符串”,您可以使用c_str()上的string方法。如果您需要将C ++ string的内容传递给只能理解NUL终止变体的函数,这非常有用。

std::string s("a string"); // s is initialized,
                           // the length is computed when \0 is encountered.
assert(s.size() == sizeof("a string")-1);
                           // sizeof string literal includes the \0
assert(s.c_str()[s.size()] == '\0');
                           // c_str() includes the \0

在第一个程序中,您正在使用初始化列表初始化一个char数组。初始化等效于以下内容:

char str[6] = "Hello";

这种初始化char数组的方式是C ++提供的一种特殊限制,因为它是C接受的语法。

在第二个程序中,您将从标准输入中获取名称。当C ++扫描输入以填充string参数时,它基本上逐字节扫描,直到它遇到分隔符(默认情况下为空格字符)。它可能会也可能不会在最后插入一个NUL字节。

答案 1 :(得分:2)

jxh是对的。 C-Strings是char-arrays,并且数组没有可以查询的length属性(尽管在某些情况下你可以通过使用sizeof(...)获得数组的大小)。因此,当您处理类似c的字符串时,应使用\ 0或\ n。

终止它们

答案 2 :(得分:0)

你本身并没有遗漏任何东西。 null终止符用于字符数组以指示结束。但是,字符串类会为您处理所有这些。长度属性是一种完全可以接受的方式,因为您正在使用字符串。

但是,如果您正在使用字符数组,那么是的,您需要检查是否在null终止符上,因为您可能不知道字符串的长度。

以下内容不会给您带来任何问题。

int length = 2;
char str[] = "AB";

但是,请尝试以下操作,然后您会看到一些问题。

int length = 5;
char str[length + 1] = "ABCDE"; // +1 makes room for automatic \0

char str2[length + 1] = "ABC";

尝试使用你的for循环方法知道长度的第二个剪切,第一个将给你ABCDE,但第二个将给你&#34; ABC&#34;接下来是一个垃圾角色。它只是一个,因为你的数组中有[A][B][C][\0][JUNK]。缩短长度,你会看到更多的垃圾。