Вывод строк входного потока, включающих в себя более 10 символов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго дня или ночи всем участникам форума. Написал программу, воспользовавшись примером из учебника Кернигана, но она по каким то причинам не компиллируется. Пользуюсь компиллятором gcc.
#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;
    }
 
}
компиллятор выдает следующие предупреждения: 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 Прошу помочь разобраться в ситуации.

Решение задачи: «Вывод строк входного потока, включающих в себя более 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;
    }
 
}

Объяснение кода листинга программы

  1. Включаемые заголовочные файлы:
    • stdio.h содержит функции ввода-вывода, используемые для отправки данных в консоль и получения данных из консоли;
    • string.h содержит функции для работы со строками, такие как strlen и strcpy.
  2. Пределы длины строки и количества символов для вывода:
    • LIM установлен на 1000, что предполагает, что вводные строки не будут длиннее этого значения;
    • OUTLINE установлен на 10, что предполагает, что только строки, содержащие не менее 11 символов, будут выводиться.
  3. Функции, определенные в коде:
    • getline используется для считывания вводимой строки и возврата ее длины;
    • copy используется для копирования строки из одного массива в другой.
  4. Основной цикл программы:
    • Пока вводная строка не пуста (т.е. длина строки больше 0), выполняется следующий блок кода;
      • Если длина строки больше OUTLINE, то выполняется следующий блок кода:
      • Копия введенной строки сохраняется в массиве printline;
      • Введенная строка выводится на консоль с помощью функции printf.
  5. Функция getline:
    • Считывает вводимую строку, используя функцию getchar, которая возвращает следующий символ из стандартного ввода;
    • Если достигнут конец файла (EOF), функция немедленно возвращает 0;
    • Если вводимая строка пуста, функция немедленно возвращает 0;
    • Если вводимая строка содержит символ новой строки (\n), он добавляется в конец массива, и функция продолжает считывание следующего символа;
    • Если вводимая строка не содержит символа новой строки, она дополняется символом новой строки и возвращается ее длина.
  6. Функция copy:
    • Копирует строку из массива from в массив to;
    • Пока не достигнут конец строки (т.е. не будет достигнут символ новой строки), выполняется следующий блок кода:
      • символ из массива from копируется в массив to;
      • индекс увеличивается на 1.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5
Похожие ответы