2016-11-26 14 views
3

Итак, я просто прочитал пример создания массива символов, представляющих строку.Когда/Почему « 0» необходимо пометить конец массива (char)?

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

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

char line[100]; 

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

"hello\n" 

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

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

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

+1

\ 0 используется для обозначения конца символьной строки в C. Большинство функций библиотеки std std требует, чтобы строка была прекращена таким образом, чтобы работать. – Outshined

+0

Поскольку C не знает, как долго ваша строка, вы должны отметить конец символом \ 0, чтобы он знал, что он достиг конца вашей строки. –

+0

Вы можете использовать строки Pascal в C тоже. Конечно, существующие функции не ожидают, что они не будут работать вместе. – harold

ответ

1

When/Why '\ 0' необходимо отметить конец массива (char)?

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

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

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

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

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

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

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

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

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

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

    printf("The size pf 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 pf the array is 100 
and the length of the stored string 
hello 
is 6 

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

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

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

1

'\ 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 и str3 '\ 0' символ добавляется автоматически, но в двух других вам необходимо явно добавить.

6

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

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

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

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

1

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

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

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

#include <stdio.h> 

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

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

Теперь попробуйте это:

#include <stdio.h> 

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

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

1

Длина строки 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!" Это может использоваться для многих струнных методов и функций !.