12

为什么我们需要在 C 中的字符数组末尾添加一个'\0'(null)?我在 K&R 2 (1.9 Character Array) 中读过它。书中查找最长字符串的代码如下:

#include <stdio.h>
#define MAXLINE 1000
int readline(char line[], int maxline);
void copy(char to[], char from[]);

main() {
    int len;
    int max;
    char line[MAXLINE];
    char longest[MAXLINE];
    max = 0;
    while ((len = readline(line, MAXLINE)) > 0)
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    if (max > 0)
        printf("%s", longest);
    return 0;
}

int readline(char s[],int lim) {
    int c, i;
    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0'; //WHY DO WE DO THIS???
    return i;
}

void copy(char to[], char from[]) {
    int i;
    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

我的问题是为什么我们将字符数组的最后一个元素设置为'\0'?没有它,该程序可以正常工作...请帮助我...

4

8 回答 8

15

您需要以 C 字符串结尾,'\0'因为这是库知道字符串在哪里结束的方式(在您的情况下,这是copy()函数所期望的)。

没有它,该程序可以正常工作...

没有它,您的程序将具有未定义的行为。如果程序碰巧做了你期望它做的事情,你只是幸运(或者,更确切地说,不幸,因为在现实世界中,未定义的行为会选择在最不方便的情况下表现出来)。

于 2012-12-16T18:17:04.547 回答
1

特别是指向不知道长度的字符数组的字符串指针是NULL终止符确定字符串长度的唯一方法。

链接上关于 NULL 终止的精彩讨论

于 2012-12-16T18:20:36.553 回答
1

在 c 中,“字符串”表示以空字符结尾的字符数组。将此与帕斯卡字符串进行比较,这意味着最多有 255 个字符,前面有一个指示字符串长度的字节(但不需要终止)。

每种方法都有其优点和缺点。

于 2012-12-16T18:24:46.360 回答
0

因为 C 将字符串定义为由第一个空字符终止并包括在内的连续字符序列

基本上,C 的作者可以选择将字符串定义为字符序列 + 字符串的长度,或者使用魔术标记来分隔字符串的结尾。

有关该主题的更多信息,我建议阅读这篇文章:

Poul-Henning Kamp 的“最昂贵的单字节错误” http://queue.acm.org/detail.cfm?id=2010365

于 2012-12-16T18:34:23.917 回答
0

您实际上已经在这里自己写了答案:

void copy(char to[], char from[]) {
    int i;
    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

此函数中的循环将继续,直到它在数组中遇到 '\0' from。如果没有终止零,循环将继续执行未知数量的步骤,直到遇到零或无效的内存区域。

于 2012-12-16T18:50:36.200 回答
0

实际上,您不需要以 \0 结束字符数组。它是 char* 或需要由它结束的字符串的 C 表示形式。

至于数组,如果要将其传输到字符串(由char *表示),则必须在其末尾添加一个\ 0。

另一方面,如果要将其寻址为 char* 并计划在其上使用 char* 函数,则需要在数组的末尾有 \0。

于 2012-12-17T11:26:43.050 回答
0

'\0'在数组中表示字符串的结尾,这意味着该字符之后的任何字符都不被视为字符串的一部分。这并不意味着它们不是字符数组的一部分。即,我们仍然可以通过索引来访问这些字符,但是当我们向这个字符数组调用与字符串相关的东西时,它们不是一部分。

为了使字符串具有正确的格式并能够与字符串函数一起正常工作,它必须是一个以空字符结尾的字符数组。如果没有 NULL,当我们在字符数组上调用字符串函数时,程序会显示未定义的行为。尽管大多数时候我们可能会对结果感到幸运,但这仍然是一种未定义的行为。

于 2016-12-12T07:28:40.767 回答
-1

它是字符串终止符号,遇到这种情况时,编译器会知道您的字符串已结束。

于 2012-12-16T20:07:47.833 回答