Найти ошибку в коде из учебника Керниган и Ритчи - C (СИ)
Формулировка задачи:
В тексте книги написан такой код
Но в нём на мой взгляд ошибки со скобками и видимо что то ещё. Я немного подправил скобочки и вот что вышло
А при компиляции ругается на константу и от нее зависимое. Никак не могу понять, что с ней не так?
#include <stdio.h>
#define MAXLINE 1000 /* максимальный размер вводимой строки */
int getline(char linef], int MAXLINE);
void copy(char to[], char fromf]);
/* печать самой длинной строки */
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", longest);
return 0;
}
/* getline: читает строку в s, возвращает длину */
int getline(char s[], int lim)
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && с != '\n'; ++i)
s[i] = c;
if (c == 'n'; {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
/* copy: копирует из 'from' в 'to'; to достаточно большой */
void copy(char to[], char from[])
{
int i;i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}#include <stdio.h>
#define MAXLINE 1000 /*максимальный размер вводимой строки*/
/*----------------объявление функций----------------*/
int getline(char linef[], int MAXLINE);
void copy(char to[],char fromf[]);
/*--------------------------------------------------*/
/*печать самой длинной строки*/
main()
{
int len; //длина текущей строки
int max = 0 ; //длина максимальной из просмотренных строк
char line[MAXLINE]; //текущая строка
char longest[MAXLINE]; //самая длинная строка
while((len = getline(line, MAXLINE)) > 0 )
if (len > max) {
max = len;
copy(longest, line);
}
if(max > 0) //была ли хоть одна строка
printf ("%s", longest) ;
return 0;
}
/*--------------------------------------------------------------------------------------------------------*/
/* getline: читает строку в s, возвращает длину*/
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: копирует из 'from' в 'to' ; to достаточно большой */
void copy(char to[],char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
les.c:4:17: error: expected ‘;’, ‘,’ or ‘)’ before numeric constant
#define MAXLINE 1000 /*максимальный размер вводимой строки*/
^
les.c:6:31: note: in expansion of macro ‘MAXLINE’
int getline(char linef[], int MAXLINE);
^
les.c: In function ‘main’:
les.c:17:2: warning: passing argument 1 of ‘getline’ from incompatible pointer type [enabled by default]
while((len = getline(line, MAXLINE)) > 0 )
^
In file included from les.c:2:0:
/usr/include/stdio.h:678:20: note: expected ‘char ** __restrict__’ but argument is of type ‘char *’
extern _IO_ssize_t getline (char **__restrict __lineptr,
^
les.c:17:2: warning: passing argument 2 of ‘getline’ makes pointer from integer without a cast [enabled by default]
while((len = getline(line, MAXLINE)) > 0 )
^
In file included from les.c:2:0:
/usr/include/stdio.h:678:20: note: expected ‘size_t * __restrict__’ but argument is of type ‘int’
extern _IO_ssize_t getline (char **__restrict __lineptr,
^
les.c:17:2: error: too few arguments to function ‘getline’
while((len = getline(line, MAXLINE)) > 0 )
^
In file included from les.c:2:0:
/usr/include/stdio.h:678:20: note: declared here
extern _IO_ssize_t getline (char **__restrict __lineptr,
^
les.c: At top level:
les.c:28:5: error: conflicting types for ‘getline’
int getline(char s[], int lim)
^
In file included from les.c:2:0:
/usr/include/stdio.h:678:20: note: previous declaration of ‘getline’ was here
extern _IO_ssize_t getline (char **__restrict __lineptr,
Решение задачи: «Найти ошибку в коде из учебника Керниган и Ритчи»
textual
Листинг программы
int getline(char linef[], int MAXLINE);