Почему нам нужно добавить " " (null) в конце символьного массива в C?
почему нам нужно добавить " " (null) в конце символьного массива в C? Я прочитал его в 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] = ''; //WHY DO WE DO THIS???
return i;
}
void copy(char to[], char from[]) {
int i;
i = 0;
while ((to[i] = from[i]) != '')
++i;
}
мой вопрос в том, почему мы устанавливаем последний элемент массива символов как ""? Программа прекрасно работает и без него... Пожалуйста, помогите мне...
8 ответов
вам нужно закончить строки C с ''
поскольку именно так библиотека знает, где заканчивается строка (и, в вашем случае, это то, что
в c "string" означает нулевой завершенный массив символов. Сравните это со строкой pascal, которая означает не более 255 символов, предшествующих байту, указывающему длину строки (но не требующему завершения).
каждый appraoch имеет свои плюсы и минусы.
особенно строковые указатели, указывающие на массив символов без известной длины, - единственный способ NULL
terminator определит длину строки.
удивительная дискуссия о нулевом завершении в ссылке
потому что C определяет строку как непрерывная последовательность символов, заканчивающаяся первым нулевым символом.
в основном авторы C имели выбор определить строку как последовательность символов + длину строки или использовать магический маркер для разграничения конца строки.
для получения дополнительной информации по этому вопросу я предлагаю прочитать эту статью:
"самая дорогая однобайтовая ошибка" поул-Хеннинга Kamp http://queue.acm.org/detail.cfm?id=2010365
вы на самом деле написали ответ сами прямо здесь:
void copy(char to[], char from[]) {
int i;
i = 0;
while ((to[i] = from[i]) != '')
++i;
}
цикл в этой функции будет продолжаться, пока не встретится '\0' в массиве С. Без завершающего нуля цикл будет продолжать неизвестное количество шагов, пока не встретится с нулем или недопустимой областью памяти.
на самом деле, вы делаете не нужно конец массива символ \0. Это char*, или C-представление строки, которое должно быть закончено им.
Что касается массива, вы должны добавить \0 после его конец, если вы хотите передать его в строку (representer by char*).
с другой стороны, вам нужно иметь \0 в конце массива, если вы хотите адресовать его как char* и планируете использовать функции char* на нем.
''
в массиве указывается конец строки, Что означает, что любой символ после этого символа не считается частью строки.Это не значит, что они не являются частью массива символов. т. е. мы все еще можем получить доступ к этим символам путем индексирования, но они просто не являются частью, когда мы вызываем строки, связанные с этим массивом символов.
чтобы строка была в правильном формате и могла правильно работать со строковыми функциями, она должна быть символом с нулевым завершением матрица. Без NULL программы показывают неопределенное поведение при вызове строковых функций в массиве символов. Даже если нам может повезти с результатами в большинстве случаев, это неопределенное поведение.