Керниган Ритчи Глава 1.9 символьные массивы - C (СИ)
Формулировка задачи:
В главе 1.9 символьные массивы Керниган Ричи не понятно для чего нужны и как работают выделенные строки.
Сама программа находит самую длинную вводимую строку и печатает её
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 100
int getline(char s[],int lim);
void copy (char to[], char from[]);
int main()
{
int len;
int max;
char line[MAXLINE];
char longest[MAXLINE];
max=0;
while((len=getline(line,MAXLINE))>0)
if (len>max)
{
max=len;
copy(longest,line);
}
if(max>0)
printf("%s\n",longest);
system("PAUSE");
return 0;
}
int getline(char s[],int lim)
{
int c,i;
for(i=0;(i<lim-1)&&((c=getchar())!=EOF)&&(c!='\n');++i)
s[i]=c;
[COLOR="Red"] if (c=='\n')
{
s[i]=c;
i++;
}
s[i]='\0'; [/COLOR] Программа и без этих строк работает. Для чего нужно? Как работает?
return i;
}
[COLOR="red"]void copy (char to[], char from[])
{
int i;
i=0;
while((to[i]=from[i])!='\0')
++i; [/COLOR] Ну тут я вообще не понял. Ну присваивает массиву to(аргумент - массив longest) значение массива from(аргумент - массив line). Но в функции main печатает же longest. Каким образом to==longest. Ведь в предыдущей главе 1.8 сказано что [I]"в СИ вызываемая функция (т.е. getline) не может непосредственно изменить переменную(т.е. longest) вызывающей функции(т.е. main): она может изменить только её частную, временную копию."[/I]
}Решение задачи: «Керниган Ритчи Глава 1.9 символьные массивы»
textual
Листинг программы
if (c=='\n')// если цикл закончился вводом "Энтер"
{
s[i]=c;// занесем его тоже в строку
i++; // увеличим индекс
Объяснение кода листинга программы
- Проверяется условие, что символ равен символу новой строки '\n'.
- Если условие выполняется, то выполняется блок кода:
- Символ новой строки '\n' записывается в строку s[i].
- Индекс i увеличивается на 1.