Created
December 21, 2019 06:22
-
-
Save DieTime/4d93d26a375530fa804fdfb5c02c61ca to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <locale.h> | |
// Подсчет размера строки | |
int strlen(char* a) { | |
int i = 0; | |
while (a[i] != '\0') { | |
i++; | |
} | |
return i; | |
} | |
// Побитовое копирование строк | |
void mystrcpy(char* a, int n, char* b) { | |
int i = 0; | |
for (i = 0; i < n; i++) { | |
a[i] = b[i]; | |
} | |
} | |
int main() { | |
setlocale(LC_ALL, "rus"); | |
int j = 0; | |
int i = 0; | |
int listIndex = 0; | |
int listSize = 0; | |
int inputStringLength = 0; // Размер считанной строки | |
int length = 0; // Для подсчета слов которые уложатся в ширину | |
int width = 0; // Ширина | |
int freeSpaces = 0; // Колличество пробелов, которые надо добавить | |
int usedSpaces = 0; // Колличество пробелов которое было добавлено | |
// Считывание ширины | |
printf("Введите ширину: "); | |
scanf_s("%d", &width); | |
printf("\n"); | |
char** list = (char**)malloc(sizeof(char*) * 256); // Список слов | |
for (i = 0; i < 256; i++) { | |
list[i] = (char*)malloc(sizeof(char) * 32); | |
} | |
int stringIndex = 0; | |
char* string = (char*)malloc(sizeof(char) * 32); // Массив для считывания | |
int ch; // Символ для считывания | |
// Открытие файла | |
FILE* input; | |
fopen_s(&input, "text.txt", "r"); | |
// Чтение всех слов из файла | |
ch = fgetc(input); | |
// Выполняем до тех пор пока не будут выведены все слова | |
while (ch != EOF || listIndex > 0) { | |
while (ch != EOF && ch != '\n') { | |
while (ch == ' ') { | |
ch = fgetc(input); | |
} | |
while (ch != ' ' && ch != ',' && ch != '.' && ch != '!' && ch != '?' && ch != '\n' && ch != '\0') { | |
string[stringIndex] = ch; | |
stringIndex++; | |
ch = fgetc(input); | |
} | |
string[stringIndex] = '\0'; | |
if (stringIndex != 0) { | |
mystrcpy(list[listIndex], 32, string); | |
listIndex++; | |
} | |
stringIndex = 0; | |
string[0] = '\0'; | |
if (ch != EOF && ch != '\n') { | |
ch = fgetc(input); | |
} | |
} | |
// Считываем длину входной строки | |
inputStringLength = 0; | |
for (i = 0; i < listIndex; i++) { | |
inputStringLength += strlen(list[i]) + 1; | |
} | |
// Длина совпадает с шириной, то просто выводим слова | |
if (inputStringLength - 1 == width) { | |
for (int k = 0; k < listIndex; k++) { | |
printf("%s ", list[k]); | |
} | |
printf("\n"); | |
listIndex = 0; | |
} | |
// Если длина меньше ширины, то выводим строку предварительно заполнив пробелами | |
else if (inputStringLength - 1 < width) { | |
freeSpaces = width - inputStringLength; | |
usedSpaces = 0; | |
// проходимся по всем словам | |
for (i = 0; i < listIndex; i++) { | |
// если осталось единственное слово, просто выводим его | |
if (listIndex == 1) printf("%s\n", list[i]); | |
// если это последнее слово, то выводим его с оставшимися пробелами | |
else if (i == listIndex - 1) { | |
for (j = 0; j < 1 + freeSpaces - usedSpaces; j++) { | |
printf("%c", ' '); | |
} | |
printf("%s\n", list[i]); | |
} | |
// В ином случае выводим слово, с оптимальным колличеством пробелов | |
else { | |
printf("%s", list[i]); | |
for (j = 0; j < 1 + freeSpaces / (listIndex - 1); j++) { | |
printf("%c", ' '); | |
} | |
usedSpaces += freeSpaces / (listIndex - 1); | |
} | |
} | |
listIndex = 0; | |
} | |
// Если строка не умещается в ширину | |
else { | |
// Находим такое колличество слов которые уместятся в ширине | |
length = strlen(list[0]); | |
i = 1; | |
if (length > width) { | |
printf("\nОшибка!!!Невозможно уместить текст в заданную ширину.\n"); | |
printf("Слово \"%s\" превышает данную ширину.\n\n", list[0]); | |
getch(); | |
exit(1); | |
} | |
else { | |
while (length <= width) { | |
length += strlen(list[i]) + 1; | |
i++; | |
} | |
} | |
if (length > width) { | |
i--; | |
length = length - strlen(list[i]); | |
} | |
usedSpaces = 0; | |
freeSpaces = width - (length); | |
// Проходимся по всем словам и выводим с необходимым колличеством пробелов | |
for (j = 0; j < i; j++) { | |
// Если слово осталось 1, то просто выводим его | |
if (i == 1) printf("%s\n", list[j]); | |
// Если слово последнее то выводим его с оставшимися пробелами | |
else if (j == i - 1) { | |
for (int k = 0; k < 1 + freeSpaces - usedSpaces; k++) { | |
printf("%c", ' '); | |
} | |
printf("%s\n", list[j]); | |
} | |
// В ином случае выводим слово с оптимальным количеством пробелов | |
else { | |
printf("%s", list[j]); | |
for (int k = 0; k < 1 + freeSpaces / (i - 1); k++) { | |
printf("%c", ' '); | |
} | |
usedSpaces += freeSpaces / (i - 1); | |
} | |
} | |
} | |
// Сохраняем слова которые не уложились в ширину | |
j = 0; | |
for (int k = i; k < listIndex; k++) { | |
mystrcpy(list[j], 32, list[k]); | |
j++; | |
} | |
listIndex = j; | |
// Переходим к следующей строке | |
ch = getc(input); | |
} | |
// Закрытие файла | |
fclose(input); | |
// Высвобождение выделенной памяти | |
for (i = 0; i < 256; i++) { | |
free(list[i]); | |
} | |
free(list); | |
free(string); | |
printf("\n"); | |
getch(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment