Току що започнах да уча програмиране. Това е първият ми пост. Чета книга "Език за програмиране C" от Керниган и Ричи и попаднах на пример, който не разбирам (раздел 1.9, стр. 30).
Тази програма приема текст като вход, определя най-дългия ред и го отпечатва. Деклариран е ред на символен масив [MAXLINE], където MAXLINE е 1000. Това трябва да означава, че последният елемент от този масив има индекс MAXLINE-1, който е 999. Въпреки това, ако погледнете функцията getline, която се предава line[ ] масив като аргумент (и MAXLINE като lim), изглежда, че ако въведеното от потребителя е ред, по-дълъг от MAXLINE, i ще се увеличава, докато i = lim, тоест i = MAXLINE. Следователно изразът line[i] = '\0' ще бъде line[MAXLINE] = '\0'.
Това ми изглежда грешно - как можем да пишем в местоположението на линия [MAXLINE], ако размерът на линия [] е MAXLINE. Няма ли да пише в местоположението извън масива?
Единственото обяснение, което мога да измисля, е, че когато декларира char array[size], езикът C всъщност създава char array[size+1] масив, където последният елемент е запазен за NULL знака. Ако е така, това е доста объркващо и не се споменава в книгата. Може ли някой да потвърди това или да обясни какво се случва?
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/* print the longest input line */
main()
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
/* getline: read a line into s, return length */
int getline(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';
return i;
}
/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}