Когда/почему «\ 0» необходимо отметить конец массива (символов)?

Итак, я только что прочитал пример того, как создать массив символов, представляющих строку.

Нулевой символ \0 помещается в конец массива, чтобы отметить конец массива. Это необходимо?

Если бы я создал массив символов:

char line[100]; 

и поставить слово:

"hello\n"

в нем символы будут размещены в первых шести индексах line[0] - line[6], поэтому остальная часть массива все равно будет заполнена нулевыми символами?

В этой книге говорится, что по соглашению, например, строковая константа "hello\n" помещается в массив символов и заканчивается \0.

Может я не до конца разбираюсь в этой теме и был бы рад просветлению.


person Strict    schedule 26.11.2016    source источник
comment
\0 используется для обозначения конца строки символов в C. Большинство стандартных библиотечных функций C требуют, чтобы строка заканчивалась таким образом, чтобы работать.   -  person Outshined    schedule 26.11.2016
comment
Поскольку C не знает, какова длина вашей строки, вы должны пометить конец символом \0, чтобы он знал, что достиг конца вашей строки.   -  person Cedric Martens    schedule 26.11.2016
comment
Вы также можете использовать строки Pascal в C. Конечно, существующие функции этого не ожидают, поэтому они не будут работать вместе.   -  person harold    schedule 26.11.2016
comment
Возможный дубликат Какова причина для строк с завершающим нулем?   -  person Eli Sadoff    schedule 27.11.2016
comment


Ответы (5)


Когда/почему «\ 0» необходимо отметить конец массива (символов)?

Завершающий ноль необходим, если массив символов содержит строку. Это позволяет найти точку, где заканчивается строка.

Что касается вашего примера, то, как я думаю, выглядит следующим образом

char line[100] = "hello\n";

тогда для начала строковый литерал имеет 7 символов. Это строка, включающая завершающий ноль. Этот строковый литерал имеет тип char[7]. Вы можете представить это как

char no_name[] = { 'h', 'e', 'l', 'l', 'o', '\n', '\0' };

Когда строковый литерал используется для инициализации массива символов, все его символы используются в качестве инициализаторов. Таким образом, относительно примера семь символов строкового литерала используются для инициализации первых 7 элементов массива. Все остальные элементы массива, которые не были инициализированы символами строкового литерала, будут неявно инициализированы нулями.

Если вы хотите определить, как долго строка хранится в массиве символов, вы можете использовать стандартную функцию C strlen, объявленную в заголовке <string.h>. Он возвращает количество символов в массиве до завершающего нуля.

Рассмотрим следующий пример

#include <stdio.h>
#include <string.h>

int main(void) 
{
    char line[100] = "hello\n";

    printf( "The size of the array is %zu"
            "\nand the length of the stored string \n%s is %zu\n",
            sizeof( line ), line, strlen( line ) );

    return 0;
}

Его вывод

The size of the array is 100
and the length of the stored string 
hello
 is 6

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

char line[6] = "hello\n";

В этом случае вы не можете сказать, что массив содержит строку, потому что последовательность символов, хранящихся в массиве, не имеет завершающего нуля.

person Vlad from Moscow    schedule 26.11.2016

Символ \0 не обозначает "конец массива". Символ \0 отмечает конец строки, хранящейся в массиве символов, если (и только если) этот массив символов предназначен для хранения строки.

Массив символов - это просто массив символов. Он хранит независимые целочисленные значения (char — это всего лишь небольшой целочисленный тип). Массив символов не обязательно должен заканчиваться на \0. \0 не имеет особого значения в массиве символов. Это просто нулевое значение.

Но иногда массивы символов используются для хранения строк. Строка — это последовательность символов, заканчивающаяся \0. Таким образом, если вы хотите использовать свой массив символов как строку, вы должны завершить строку символом \0.

Таким образом, ответ на вопрос о том, что \0 является «необходимым», зависит от того, что вы храните в своем массиве символов. Если вы сохраняете строку, вам придется завершать ее с помощью \0. Если вы сохраняете что-то, что не является строкой, то \0 вообще не имеет особого значения.

person AnT    schedule 26.11.2016

'\0' не требуется, если вы используете его как массив символов. Но если вы используете массив символов как строку, вам нужно поставить '\0'. В C нет отдельного строкового типа.

Существует несколько способов объявить массив символов.

Ex:

char str1[]    = "my string";
char str2[64]  = "my string";
char str3[]    = {'m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'};
char str4[64]  = {'m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'};

Все эти массивы имеют одну и ту же строку «моя строка». В str1 и str2 символ '\0' добавляется автоматически, а в двух других нужно добавлять явно.

person MayurK    schedule 26.11.2016

Вам нужен нулевой символ, чтобы отметить конец строки. C не хранит никакой внутренней информации о длине массива символов или длине строки, поэтому нулевой символ/байт \0 отмечает, где он заканчивается.

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

Например, попробуйте этот фрагмент кода:

#include <stdio.h>

int main(void) {
    char string[1];
    string[0] = 'a';
    printf("%s", string);
}

Обратите внимание, что массив символов полностью заполнен данными. Таким образом, нет нулевого байта для обозначения конца. Теперь printf будет печатать до тех пор, пока не встретится с нулевым байтом — это будет где-то за концом массива, так что вы распечатаете много мусора в дополнение к простому «a».

Теперь попробуйте следующее:

#include <stdio.h>

int main(void) {
    char string[2];
    string[0] = 'a';
    string[1] = '\0';
    printf("%s", string);
}

Он напечатает только «а», потому что конец строки явно отмечен.

person Rushy Panchal    schedule 26.11.2016

Длина строки C (массив, содержащий символы и оканчивающийся символом '\0') определяется путем поиска (первого) байта NUL. \0 - нулевой символ. В C он в основном используется для обозначения окончания строки символов. Я привожу вам пример:

допустим, вы записали слово в файл:

word = malloc(sizeof(cahr) * 6);
word = "Hello";
fwrite(word, sizeof(char), 6, fp);

где в word мы выделяем место для 5 символов «Hello» плюс еще один для его завершающего «\ 0». fp - это файл. А теперь мы пишем еще одно слово после последнего:

word2 = malloc(sizeof(cahr) * 7);
word2 = "world!";
fwrite(word2, sizeof(char), 7, fp);

Итак, давайте прочитаем два слова:

char buff = malloc(sizeof(char)*1000); // See that we can store as much space as we want, it won't change the final result
/* 13 = (5 chacater from 'Hello')+(1 character of the \0)+(6 characters from 'world!')+(1 character from the \0) */
fread(buff, sizeof(char), 13, fp); // We read the words 'Hello\0' and 'world!\0'
printf("the content of buff is: %s", buff); // This would print 'Hello world!'

Последнее связано с конечным символом \0, поэтому C знает, что в буфере есть две разделенные строки. Если бы мы не поставили этот символ \0 в конце обоих слов и не повторили тот же пример, вывод был бы "Helloworld!". Это можно использовать для многих строковых методов и функций!.

person wj127    schedule 26.11.2016