Поставить в начале каждой строки (в том числе и пустой) ее порядковый номер - 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 и выполняет следующие действия:
- Выводит на экран число 163 (или другой номер строки, если он отличается от 163).
- Завершает текущую строку символом перевода строки ('\n'). В данном коде нет присвоения значений переменным, поэтому список переменных и их значений отсутствует.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д