Нужны объяснения примеров из книги "Язык программирования Си" Брайан Керниган, Деннис Ритчи - C (СИ)

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

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

Добры день. Начал читать книгу "Язык программирования Си" Брайан Керниган, Деннис Ритчи; для лучшего усвоения использую приведенные примеры. Есть загвоздка. Нужны комментарии, чтобы разобраться. 1. Вот кусок кода из примера:
#include <stdio.h>
#define MAXLINE 1000 /* максимальный размер вводимой строки */
int getline(char line[], int MAXLINE);
void copy(char to[], char from[]);
При компиляции выдаёт ошибку, что перед константой надо разделитель поставить. 2. Убрал константу из объявления функции, но теперь при компиляции проблема с типом переменных для функции getline().
#include <stdio.h>
#define MAXLINE 1000
 
int getline(char linef[], int counter);
void copy(char tot[], char fromf[]);

main()
{
    FILE *file;
    char name[100];
    scanf("%s",name);
    file = fopen(name,"r");
 
    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;
}

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;
}

void copy(char to[], char from[])
{
    int i;
    i = 0;
    while ((to[i] = from[i]) != '\0')
    ++i;
}

Решение задачи: «Нужны объяснения примеров из книги "Язык программирования Си" Брайан Керниган, Деннис Ритчи»

textual
Листинг программы
#include <stdio.h>
#define MAXLINE 1000
 
int getline(char line[], int counter);
void copy(char to[], char from[]);
 
 
main()
{
    FILE *file;
    char name[100];
    scanf("%s",name);
    file = fopen(name,"r");
 
    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;
}
 
 
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;
}
 
 
void copy(char to[], char from[])
{
    int i;
    i = 0;
    while ((to[i] = from[i]) != '\0')
    ++i;
}

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

  1. #include Включает файл стандартных библиотек, необходимых для работы с функциями ввода-вывода.
  2. #define MAXLINE 1000 Определяет максимальную длину строки, которую можно прочитать в цикле.
  3. int getline(char line[], int counter); Функция, предназначенная для чтения строки из файла до конца строки или до EOF. Возвращает длину строки.
  4. void copy(char to[], char from[]); Копирует строку из одного массива в другой.
  5. main() Главная функция программы. Открывает файл для чтения, инициализирует переменные и входит в цикл чтения строк до тех пор, пока не будет достигнут конец файла.
  6. scanf(%s,name); Считывает строку из консоли и сохраняет ее в переменной name.
  7. file = fopen(name,r); Открывает файл для чтения с помощью функции fopen().
  8. int len; Длина текущей строки.
  9. int max; Максимальная длина строки во всем файле.
  10. char line[MAXLINE]; Массив для хранения текущей строки.
  11. char longest[MAXLINE]; Массив для хранения самой длинной строки.
  12. while ((len = getline(line, MAXLINE)) > 0) Входит в цикл, пока не достигнут конец файла.
  13. if (len > max) { Если текущая строка длиннее самой длинной, то обновляет значение переменной max и копирует текущую строку в longest.
  14. copy(longest, line); Копирует текущую строку в longest.
  15. } Конец условия, проверяющего длину строки.
  16. if (max > 0) Если в файле были строки, то выводит на экран самую длинную строку.
  17. printf(%s, longest); Выводит на экран содержимое массива longest.
  18. return 0; Завершает работу программы.
  19. int getline(char s[], int lim) Функция для чтения строки из файла до конца строки или до EOF.
  20. void copy(char to[], char from[]) Копирует строку из одного массива в другой.

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

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