В конец каждой строки через пробел добавляется число, которое равно количеству символов в самом длинном слове данной строки - C (СИ)

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

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

Помогите составить программу: Следует разработать программу, которая преобразует любой текстовый файл в другой текстовый файл по правилу, определяемому на основе своего варианта Указанное правило применяется для каждой строки исходного текстового файла. В ходе выполнения программы пользователь может вводить имя исходного текстового файла, а также имя получаемого текстового файла.

вариант:

В конец каждой строки через пробел добавляется число, которое равно количеству символов в самом длинном слове данной строки.

Решение задачи: «В конец каждой строки через пробел добавляется число, которое равно количеству символов в самом длинном слове данной строки»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <assert.h>
 
//-----------------------------------------------------------------------------
int GetWord(char text[], char** begin, char** end) {
 
    for (; *text && isspace(*text); ++text) { ; }
    *begin = text;
 
    for (; *text && !isspace(*text); ++text) { ; }
    *end = text;
 
    return *end - *begin;
}
//-----------------------------------------------------------------------------
char* GetLine(FILE* f) {
 
    static size_t len = 0;
    static char* str = NULL;
    char ch = fgetc(f);
 
    if ((ch == '\n') || (ch == EOF)) {
        if (len) {
            str = malloc(len + 1);
            str[len] = '\0';
        }
        else {
            str = NULL;
        }
    }
    else {
        len++;
        str = GetLine(f);
        str[--len] = ch;
    }
 
    return str;
}
//-----------------------------------------------------------------------------
void FromTo(FILE* fsrc, FILE* fdest) {
 
    char* str;
    char* begin;
    char* end;
    size_t len, maxlen;
 
    while (!feof(fsrc)) {
 
        str = begin = GetLine(fsrc);
 
        maxlen = 0;
 
        if (str) {
            while ((len = GetWord(begin, &begin, &end))) {
                if (maxlen < len) {
                    maxlen = len;
                }
                begin = end;
            }
        }
 
        fprintf(fdest, "%s %u\n", str ? str : "", maxlen);
 
        free(str);
    }
}
//-----------------------------------------------------------------------------
 
int main(int argc, char* argv[]) {
 
    FILE* fsrc;
    FILE* fdest;
 
    if (argc != 3) {
        printf("Usage: %s <SOURCE> <DESTINATION>\n", argv[0]);
        return 1;
    }
 
    fsrc = fopen(argv[1], "r");
    if (fsrc == NULL) {
        perror(argv[1]);
        return 1;
    }
 
    fdest = fopen(argv[2], "w");
    if (fdest == NULL) {
        perror(argv[2]);
        fclose(fsrc);
        return 1;
    }
 
    FromTo(fsrc, fdest);
 
    fclose(fdest);
    fclose(fsrc);
 
    return 0;
}

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

  1. В первой функции, GetWord, осуществляется разбиение строки на слова. Если текущий символ является пробелом, то его пропускают (это обеспечивает корректное разделение слов в случае наличия пробелов в конце строки). Если текущий символ не является пробелом, то его также пропускают (это обеспечивает корректное разделение слов в случае наличия в строке нескольких подряд идущих пробелов). Если текущий символ является концом строки (или концом файла), то его также пропускают (это обеспечивает корректное завершение последнего слова в строке). В результате в буфер *begin записывается указатель на первый символ первого слова, а в буфер *end записывается указатель на последний символ последнего слова. Длина слова (количество символов между *begin и *end) возвращается в качестве результата.
  2. Во второй функции, GetLine, осуществляется чтение строк из файла. Если текущий символ является концом строки или концом файла, то он считывается, и в случае, если он не является концом файла, то вызывается функция GetLine рекурсивно для чтения следующего слова (это обеспечивает чтение всей строки целиком). Если текущий символ является пробелом, то его пропускают (это обеспечивает корректное разделение слов в случае наличия пробелов в конце строки). Если текущий символ не является пробелом или концом строки, то его также пропускают (это обеспечивает корректное разделение слов в случае наличия в строке нескольких подряд идущих пробелов). В результате в буфер str записывается полученная строка, а в переменной len сохраняется её длина. Если строка пустая, то буфер str освобождается.
  3. В третьей функции, FromTo, осуществляется копирование строк из одного файла в другой с добавлением в конец каждой строки числа, равного длине самого длинного слова в этой строке. Если текущая строка пустая, то её пропускают. Если текущая строка не является пустой, то её записывают в целевой файл. Затем из этой строки выделяют слова и находят длину самого длинного слова. Это число (в шестнадцатеричной системе счисления) добавляется в конец строки и записывается в целевой файл. В конце работы функции вызывается функция fprintf для вывода информации о текущей строке и числе, добавленном в конец строки. После завершения работы функции вызывается функция free для освобождения памяти, выделенной под буфер str.
  4. В функции main осуществляется чтение строк из одного файла, разбиение их на слова и запись этих строк (с добавлением чисел, равных длине самого длинного слова) в другой файл. Если аргументы командной строки не соответствуют требуемым (менее трех), то выводится сообщение об ошибке и возвращается код завершения 1. Если чтение исходного файла или запись целевого файла невозможны, то выводится сообщение об ошибке и возвращается код завершения 1. В противном случае возвращается код завершения 0.

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


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

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

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