Поставить в начале каждой строки (в том числе и пустой) ее порядковый номер - C (СИ)

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

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

по условию задачи В файле input.txt записан некоторый текст, общая длина которого заранее неизвестна (можно считать, что длина каждой строки не превосходит 4000 символов). Требуется поставить в начале каждой строки (в том числе и пустой) ее порядковый но-мер (нумерация начинается с единицы). Преобразованный текст нужно вывести в файл output.txt программа рабочая и правильная, но написана не мной, сейчас в ней разбираюсь (знание си пока на примитивном уровне, учусь на примерах) и всё понятно кроме задания констант MAX_LINES и MAX_CHARS: во-первых почему MAX_CHARS берём равным 4003, если по условию 4000 (думал может из-за символа переноса строки, но это 2 символа \n, может ещё один как бы на запас, ведь это для выделения памяти malloc.. мне нужно знать точно) и почему MAX_LINES равен 1024 (в условие нет ничего про максимальное количество строк, а этот параметр нам нужен для правильного выделения памяти, значит мы можем его брать на бум? даже если да то почему не 1000 например, а именно 1024=2^10 что схоже с битными структурами)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX_LINES 1024
#define MAX_CHARS 4003
 
void Process(char**, int);
 
int main(void)
{
    char **Text;
    int i, LinesTotal = 0;
    FILE *In, *Out;
 
    if (!(In = fopen("input.txt", "r"))) { // Открытие файла input.txt
        printf("Can not open input file for reading\n");
        return(-1);
    }
 
    if (!(Out = fopen("output.txt", "w"))) { // Открытие файла output.txt
        printf("Can not open output file for writing\n");
        fclose(In);
        return(-1);
    }
 
    if (!(Text = (char**)malloc(MAX_LINES*sizeof(void*)))) { // Выделение памяти под массив строк
        printf("Memory allocation failure\n");
        fclose(In);
        fclose(Out);
        return(-1);
    }
 
    while(!feof(In)) { // Цикл продолжается, пока в файле ещё что-то остается
        if (!(Text[LinesTotal] = (char*)malloc(MAX_CHARS*sizeof(char)))) { // Выделение памяти под строку
            printf("Memory allocation failure\n");
            fclose(In);
            fclose(Out);
            for (i = LinesTotal-1; i >= 0; --i)
                free(Text[i]);
            free(Text);
            return(-1);
        }
 
        if (fgets(Text[LinesTotal], MAX_CHARS, In)) // Чтение строки (значит, до символа \n) из файла с записью в соответствующий массив
            if (++LinesTotal == MAX_LINES)
                break;
    }
 
    fclose(In);
 
    Process(Text, LinesTotal);
 
    for (i = 0; i < LinesTotal; ++i) // Построчный вывод измененного текста в файл
        fprintf(Out, "%s", Text[i]);
    printf("\nResult has been saved to output.txt\n\n");
 
    fclose(Out);
 
    for (i = LinesTotal-1; i >= 0; --i) // Очистка памяти
        free(Text[i]);
    free(Text);
 
    return(0);
}
 
void Process(char **Text, int LinesTotal)
{
    int i, j;
    char *Str;
 
    Str = (char*)malloc(MAX_CHARS*sizeof(char));
 
    for (i = 0; i < LinesTotal; ++i) {
        strcpy(Str, Text[i]);
        sprintf(Text[i], "%d ", i+1);
        strcat(Text[i], Str);
    }
 
    free(Str);
 
    return;
}

Решение задачи: «Поставить в начале каждой строки (в том числе и пустой) ее порядковый номер»

textual
Листинг программы
printf("%d", '\n');

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

Код, представленный в вопросе, написан на языке C и выполняет следующие действия:

  1. Выводит на экран число 163 (или другой номер строки, если он отличается от 163).
  2. Завершает текущую строку символом перевода строки ('\n'). В данном коде нет присвоения значений переменным, поэтому список переменных и их значений отсутствует.

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


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

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

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