为什么我们需要在在C字符数组的末尾添加“\\ 0”(零)?(Why do we need to ad

2019-07-05 11:20发布

为什么我们需要在在C字符数组的末尾添加“\ 0”(空)? 我在K&R 2(1.9字符数组)读取。 在这本书中的代码,以找到最长的字符串如下:

#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”的最后一个元素? 该项目工程没有它罚款...请帮我...

Answer 1:

你需要结束的C字符串用'\0' ,因为这是图书馆如何知道哪里的字符串结尾(和你的情况,这是什么样copy()函数需要)。

该项目工程罚款没有它...

没有它,你的程序未定义的行为 。 如果这个程序碰巧你希望它做的事情,你只是幸运(或者说,不吉利,因为在现实世界中的不确定的行为会选择体现在最不方便的情况下)。



Answer 2:

在C“串”是指字符的空字符结尾的阵列。 用帕斯卡串,这意味着至多255个本地字符由指示字符串的长度(但无需终止)一个字节preceeded进行比较。

每个appraoch都有它的优点和缺点。



Answer 3:

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

约在NULL终止真棒讨论链接



Answer 4:

因为C定义一个字符串作为通过终止字符的连续序列,并且包括第一个空字符

基本上C的作者有选择以限定一个字符串作为字符序列串的+长度或者使用魔法标记来分隔字符串的末尾。

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

“最昂贵的一个字节的错误”由波尔·亨宁·卡普http://queue.acm.org/detail.cfm?id=2010365



Answer 5:

实际上,你自己写的答案就在这里:

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

在这个函数中的循环将继续,直到它该阵列中遇到“\ 0”。 如果没有终止零循环将continure未知号码的步骤,直到遇到一个零或一个无效的存储器区域。



Answer 6:

真的,你不需要通过\ 0结束的字符数组。 它是字符*,或者需要由它结束的字符串C表现。

至于数组,你有它结束添加\ 0,如果你想(通过字符*申述)将其转移到字符串。

在另一方面,你需要有\ 0在数组的结尾,如果要解决这个问题为char *,并计划在其上使用的char *功能。



Answer 7:

'\0'阵列中的表示字符串的结束,这意味着在这之后的字符不被认为是string.It的部分,并不意味着它们不是字符阵列的一部分的任何字符。 即,我们仍然可以访问这些字符通过索引,但他们只是不属于我们调用字符串相关的东西到这个字符数组。

对于一个字符串,在适当的格式,并能够与字符串函数正常工作,它必须是一个空终止字符数组。 如果没有NULL,程序显示不确定的行为,当我们的字符数组上调用字符串函数。 尽管我们可能会得到幸运的结果大多数时候,它仍然是一个不确定的行为。



Answer 8:

这是字符串终止符,当此遇到,编译器都知道您的字符串结束。



文章来源: Why do we need to add a '\\0' (null) at the end of a character array in C?