Подтвердить что ты не робот

Почему нам нужно добавить '\ 0' (null) в конце массива символов в C?

Почему нам нужно добавить '\ 0' (null) в конце массива символов в C? Я прочитал его в 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'? Программа отлично работает без нее... Пожалуйста, помогите мне...

4b9b3361

Ответ 1

Вам нужно завершить строки C с помощью '\0', так как библиотека знает, где заканчивается строка (и, в вашем случае, это то, что ожидает функция copy()).

Программа отлично работает без него...

Без этого ваша программа имеет undefined поведение. Если программа выполняет то, что вы ожидаете от нее, вам просто повезло (или, вернее, не повезло, так как в реальном мире поведение undefined будет проявляться в самых неудобных обстоятельствах).

Ответ 2

В частности, указатели строк, указывающие на массив символов без известной длины, - это единственный способ, которым ограничитель NULL определяет длину строки.

Удивительная дискуссия о завершении NULL на ссылке

Ответ 3

В c "string" означает нулевой конец массива символов. Сравните это с строкой pascal, которая означает не более 255 символов, предшествующих байту, указывающих длину строки (но не требующей прекращения).

У каждого эксперта есть плюсы и минусы.

Ответ 4

Потому что C определяет строку как непрерывную последовательность символов, заканчивающуюся и включающую первый нулевой символ.

В основном авторы C имели возможность определить строку как последовательность символов + длину строки или использовать магический маркер для ограничения конца строки.

Для получения дополнительной информации по этому вопросу я предлагаю прочитать эту статью:

"Самая дорогая однобайтная ошибка" Poul-Henning Kamp http://queue.acm.org/detail.cfm?id=2010365

Ответ 5

Вы сами написали ответ прямо здесь:

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

Цикл в этой функции будет продолжаться до тех пор, пока он не встретит '\ 0' в массиве. Без конечного нуля цикл будет продолжать неизвестное количество шагов, пока не встретит нулевую или недопустимую область памяти.

Ответ 6

Действительно, вы не должны заканчивать массив символов с помощью \0. Это char * или представление C строки, которая должна быть завершена им.

Как и для массива, вы должны добавить конец \0 после, если хотите перенести его в строку (репрезентатор char *).

С другой стороны, вам нужно иметь \0 в конце массива, если вы хотите адресовать его как char * и планируете использовать на нем функции char *.

Ответ 7

'\0' в массиве указывает конец строки, что означает любой символ после того, как этот символ не считается частью строки. Это не означает, что они не являются частью массива символов. то есть мы можем получить доступ к этим символам путем индексирования, но они просто не являются частью, когда мы вызываем связанные с строкой объекты в этот массив символов.

Чтобы строка была в правильном формате и могла нормально работать со строковыми функциями, она должна быть символьным массивом с нулевым символом. Без NULL программы показывают поведение undefined при вызове строковых функций в массиве символов. Несмотря на то, что в большинстве случаев нам могут повезти с результатами, все равно это поведение undefined.

Ответ 8

Это символ завершения строки. Когда это встречается, компилятор узнает, что ваша строка завершена.