Advertisement
oshuej

Untitled

May 29th, 2020
1,155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.25 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MALLOC_ERROR 4
  5.  
  6. const unsigned int MAX_LENGTH = 1 * 1024 * 1024;  // Не выделять больше мегабайта памяти
  7. const unsigned int CHUNK_SIZE = 1024;             // Выделять блоками по килобайту
  8.  
  9. void readString(char *string, size_t *string_size);
  10.  
  11. void readTextAndCount(char *string, char *delimiters, size_t *string_size);
  12.  
  13. void memory_error();
  14.  
  15. int main() {
  16.  
  17.     size_t delimitersArray_size = CHUNK_SIZE;
  18.     char *delimitersArray = malloc(delimitersArray_size);
  19.     if (delimitersArray == NULL) {
  20.         memory_error();
  21.     }
  22.     printf("Введите символы-разделители: ");
  23.  
  24.     // начало считывания символов-разделителей
  25.     readString(delimitersArray, &delimitersArray_size);
  26.     // конец считывания символов-разделителей
  27.  
  28.     size_t inputText_size = CHUNK_SIZE;
  29.     char *inputText = malloc(inputText_size);
  30.     if (inputText == NULL) {
  31.         memory_error();
  32.     }
  33.     printf("Введите текст: \n");
  34.  
  35.     // начало считывания символов-разделителей
  36.     readTextAndCount(inputText, delimitersArray, &inputText_size);
  37.     // конец считывания символов-разделителей
  38.  
  39. //    printf("\"%s\"", inputText);
  40. //    printf("\nstrlen: %lu\n", strlen(inputText));
  41. //    printf("firstElem: \"%c\", lastElem: \"%c\"\n", inputText[0], inputText[strlen(inputText) - 1]);
  42.  
  43.     int isFirstElemDelimiter = 0, isLastSymbolDelimiter = 0;
  44.     for (int i = 0; i < strlen(delimitersArray); i++) {
  45.         if (inputText[0] == delimitersArray[i]) {
  46.             isFirstElemDelimiter = 1;
  47.         }
  48.         if (inputText[strlen(inputText) - 2] == delimitersArray[i]) {
  49.             isLastSymbolDelimiter = 1;
  50.         }
  51.     }
  52.  
  53.     if ((isFirstElemDelimiter == 1) && (isLastSymbolDelimiter == 1)) {
  54.         printf("Исходный текст: \n\"%s\"\n", inputText);
  55.         int firstWordStartIndex = 0, firstWordEndIndex = 0, secondWordStartIndex = 0, secondWordEndIndex = 0;
  56.         for (int i = 1; i < strlen(inputText); i++) {
  57.             int isDelimiter = 0;
  58.             for (int j = 0; j < strlen(delimitersArray); j++) {
  59.                 if (inputText[i] == delimitersArray[j]) {
  60.                     isDelimiter = 1;
  61.                 }
  62.             }
  63.             if (isDelimiter != 1) {
  64.                 if (firstWordStartIndex == 0) {
  65.                     // если еще не нашли индекс начала первого слова
  66.                     firstWordStartIndex = i;
  67.                 } else if (firstWordEndIndex != 0 && secondWordStartIndex == 0) {
  68.                     // если нашли индекс конца превого слова, а индекс начала второго слова еще не нашли
  69.                     secondWordStartIndex = i;
  70.                 }
  71.             } else {
  72.                 if (firstWordStartIndex != 0 && firstWordEndIndex == 0) {
  73.                     // если нашли индекс начала первого слова, а индекс конца первого слова еще не нашли
  74.                     firstWordEndIndex = i - 1;
  75.                 } else if (secondWordStartIndex != 0 && secondWordEndIndex == 0) {
  76.                     // если нашли индекс начала второго слова, а индекс конца еще не нашли
  77.                     secondWordEndIndex = i - 1;
  78.                 }
  79.             }
  80.  
  81.             if (firstWordStartIndex != 0 &&
  82.                 firstWordEndIndex != 0 &&
  83.                 secondWordStartIndex != 0 &&
  84.                 secondWordEndIndex != 0) {
  85.                 // если получили индексы начала/конца первого и второго слова - завершаем поиск
  86.                 break;
  87.             }
  88.  
  89.         }
  90.  
  91.         char newText[strlen(inputText)];
  92.         int counter = 0;
  93.  
  94.         for (int i = 0; i < firstWordStartIndex; i++) {
  95.             // копируем все разделители до первого слова
  96.             newText[counter] = inputText[i];
  97.             counter++;
  98.         }
  99.  
  100.         for (int i = secondWordStartIndex; i <= secondWordEndIndex; i++) {
  101.             // копируем второе слово
  102.             newText[counter] = inputText[i];
  103.             counter++;
  104.         }
  105.  
  106.         for (int i = firstWordEndIndex + 1; i < secondWordStartIndex; i++) {
  107.             // копируем разделители между первым и вторым словом
  108.             newText[counter] = inputText[i];
  109.             counter++;
  110.         }
  111.  
  112.         for (int i = firstWordStartIndex; i <= firstWordEndIndex; i++) {
  113.             // копируем первое слово
  114.             newText[counter] = inputText[i];
  115.             counter++;
  116.         }
  117.  
  118.         for (int i = secondWordEndIndex + 1; i < strlen(inputText); i++) {
  119.             // копируем со следующего элемента после конца второго слова до конца исходной строки.
  120.             newText[counter] = inputText[i];
  121.             counter++;
  122.         }
  123.  
  124.         printf("Отформатированный текст:\n\"%s\"\n", newText);
  125.     } else {
  126.         printf("Первый и последний символ не разделители.\n");
  127.     }
  128.  
  129.     free(delimitersArray);
  130.     free(inputText);
  131.  
  132.     return 0;
  133. }
  134.  
  135. void readString(char *string, size_t *string_size) {
  136.     // функция просто считывает текст из консоли
  137.  
  138.     int c = EOF;
  139.  
  140.     for (int i = 0; (c = getchar()) && (c != '\n'); i++) {
  141.         if (i == (*string_size - 1)) {
  142.             // проверяем, есть ли еще свободная память, если нет, то выделяем
  143.             *string_size += i;
  144.             string = realloc(string, *string_size);
  145.             if (string == NULL) {
  146.                 memory_error();
  147.             }
  148.         }
  149.  
  150.         if (*string_size == MAX_LENGTH) {
  151.             // проверяем, достиг ли размер массива максимального значения. Если да, то освобождаем память.
  152.             free(string);
  153.         }
  154.         string[i] = c;
  155.     }
  156. }
  157.  
  158. void readTextAndCount(char *string, char *delimiters, size_t *string_size) {
  159.     // функция считывает текст, а также считает длину слов, а также количетсво разделителей
  160.     int c = EOF, countOfDelimiters = 0, countOfSymbols = 0;
  161.  
  162.     for (int i = 0; (c=getchar()); i++) {
  163.         if ((countOfDelimiters > countOfSymbols) && c == '\n') {
  164.             string[i] = '\0';
  165.             break;
  166.         } else {
  167.             if (i == (*string_size - 1)) {
  168.                 // проверяем, есть ли еще свободная память, если нет, то выделяем
  169.                 string_size += i;
  170.                 string = realloc(string, *string_size);
  171.                 if (string == NULL) {
  172.                     memory_error();
  173.                 }
  174.             }
  175.  
  176.             if (*string_size == MAX_LENGTH) {
  177.                 // проверяем, достиг ли размер массива максимального значения. Если да, то освобождаем память.
  178.                 free(string);
  179.             }
  180.             string[i] = (char) c;
  181.  
  182.             int isDelimiter = 0;
  183.             for (int j = 0; j < strlen(delimiters); j++) {
  184.                 if (c == delimiters[j]) {
  185.                     isDelimiter = 1;
  186.                     break;
  187.                 }
  188.             }
  189.  
  190.             if (isDelimiter == 1) {
  191.                 countOfDelimiters++;
  192.             } else {
  193.                 countOfSymbols++;
  194.             }
  195.         }
  196.     }
  197. }
  198.  
  199. void memory_error() {
  200.     // необхоидмо вызывать, если не удалось динамически выделить память
  201.     printf("Произошла ошибка. Запросили слишком много памяти??\n");
  202.     exit(MALLOC_ERROR);
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement