Skip to content

Instantly share code, notes, and snippets.

@DieTime
Created December 21, 2019 06:22
Show Gist options
  • Save DieTime/4d93d26a375530fa804fdfb5c02c61ca to your computer and use it in GitHub Desktop.
Save DieTime/4d93d26a375530fa804fdfb5c02c61ca to your computer and use it in GitHub Desktop.
#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