Вывод строк входного потока, включающих в себя более 10 символов - C (СИ)
Формулировка задачи:
Доброго дня или ночи всем участникам форума.
Написал программу, воспользовавшись примером из учебника Кернигана, но она по каким то причинам не компиллируется. Пользуюсь компиллятором gcc.
компиллятор выдает следующие предупреждения:
lineout.c:5:18: error: parameter ‘line’ has just a forward declaration
lineout.c:5:5: error: conflicting types for ‘getline’
In file included from lineout.c:1:0:
/usr/include/stdio.h:678:20: note: previous declaration of ‘getline’ was here
extern _IO_ssize_t getline (char **__restrict __lineptr,
lineout.c: In function ‘main’:
lineout.c:16:3: warning: passing argument 1 of ‘getline’ makes integer from pointer without a cast [enabled by default]
while((len = getline(line, LIM)) > 0)
lineout.c:5:5: note: expected ‘int’ but argument is of type ‘char *’
int getline(char line[]; int lim); // функция возврата длины строки
lineout.c:16:3: error: too many arguments to function ‘getline’
while((len = getline(line, LIM)) > 0)
lineout.c:5:5: note: declared here
int getline(char line[]; int lim); // функция возврата длины строки
lineout.c:19:5: error: expected ‘;’ before ‘printf’
printf ("%s", printline);
lineout.c: At top level:
lineout.c:25:5: error: conflicting types for ‘getline’
int getline(char s[], int lim)
In file included from lineout.c:1:0:
/usr/include/stdio.h:678:20: note: previous declaration of ‘getline’ was here
extern _IO_ssize_t getline (char **__restrict __lineptr,
lineout.c:38:16: error: parameter ‘to’ has just a forward declaration
void copy(char to[]; char from[])
lineout.c:38:6: error: conflicting types for ‘copy’
void copy(char to[]; char from[])
lineout.c:6:6: note: previous declaration of ‘copy’ was here
void copy(char to[], char from[]); // функция копирования строки
lineout.c: In function ‘copy’:
lineout.c:40:9: error: ‘to’ undeclared (first use in this function)
while((to[i] = from[i]) != '\0')
lineout.c:40:9: note: each undeclared identifier is reported only once for each function it appears in
Прошу помочь разобраться в ситуации.
#include <stdio.h> #define LIM 1000 // предел длины строки #define outline 10 // количество символов, которое должно содержаться в выводимых строках int getline(char line[]; int lim); // функция возврата длины строки void copy(char to[], char from[]); // функция копирования строки /*вывод всех строк с длиной более 80 символов*/ int main() { int len; // длина текущей строки char line[LIM]; // текущая введенная строка char printline[LIM]; // строка, которая подлежит выводу while((len = getline(line, LIM)) > 0) { if(len > outline) { copy (printline, line); printf ("%s", printline); } } } /* getline: считывает строку в s, возвращает ее длину */ int getline(char s[], int lim) { int c, i; for(i = 0; i < lim - 1 && (c = getchar()) != '\n' && c != EOF; ++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 = 0; while((to[i] = from[i]) != '\0') { ++i; } }
Решение задачи: «Вывод строк входного потока, включающих в себя более 10 символов»
textual
Листинг программы
#include <stdio.h> #define LIM 1000 // предел длины строки #define outline 10 // количество символов, которое должно содержаться в выводимых строках int getline(char a[], int b); // функция возврата длины строки void copy(char c[], char d[]); // функция копирования строки /*вывод всех строк с длиной более 80 символов*/ int main() { int len; // длина текущей строки char line[LIM]; // текущая введенная строка char printline[LIM]; // строка, которая подлежит выводу while((len = getline(line, LIM)) > 0) { if(len > outline) { copy (printline, line); printf ("%s", printline); } } return 0; } /* getline: считывает строку в s, возвращает ее длину */ int getline(char s[], int lim) { int c, i; for(i = 0; i < lim - 1 && (c = getchar()) != '\n' && c != EOF; ++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 = 0; while((to[i] = from[i]) != '\0') { ++i; } }
Объяснение кода листинга программы
- Включаемые заголовочные файлы:
- stdio.h содержит функции ввода-вывода, используемые для отправки данных в консоль и получения данных из консоли;
- string.h содержит функции для работы со строками, такие как strlen и strcpy.
- Пределы длины строки и количества символов для вывода:
- LIM установлен на 1000, что предполагает, что вводные строки не будут длиннее этого значения;
- OUTLINE установлен на 10, что предполагает, что только строки, содержащие не менее 11 символов, будут выводиться.
- Функции, определенные в коде:
- getline используется для считывания вводимой строки и возврата ее длины;
- copy используется для копирования строки из одного массива в другой.
- Основной цикл программы:
- Пока вводная строка не пуста (т.е. длина строки больше 0), выполняется следующий блок кода;
- Если длина строки больше OUTLINE, то выполняется следующий блок кода:
- Копия введенной строки сохраняется в массиве printline;
- Введенная строка выводится на консоль с помощью функции printf.
- Пока вводная строка не пуста (т.е. длина строки больше 0), выполняется следующий блок кода;
- Функция getline:
- Считывает вводимую строку, используя функцию getchar, которая возвращает следующий символ из стандартного ввода;
- Если достигнут конец файла (EOF), функция немедленно возвращает 0;
- Если вводимая строка пуста, функция немедленно возвращает 0;
- Если вводимая строка содержит символ новой строки (\n), он добавляется в конец массива, и функция продолжает считывание следующего символа;
- Если вводимая строка не содержит символа новой строки, она дополняется символом новой строки и возвращается ее длина.
- Функция copy:
- Копирует строку из массива from в массив to;
- Пока не достигнут конец строки (т.е. не будет достигнут символ новой строки), выполняется следующий блок кода:
- символ из массива from копируется в массив to;
- индекс увеличивается на 1.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д