Advertisement
oshuej

Kontrolnaya Leha

May 19th, 2020
1,277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.46 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. const unsigned int MAX_LENGTH = 1 * 1024 * 1024;  // Не выделять больше мегабайта памяти
  6. const unsigned int CHUNK_SIZE = 1024;             // Выделять блоками по килобайту
  7.  
  8. char* readString(int maxWordsLength, const char *delimitersArray);
  9.  
  10. int main() {
  11.     int delimitersLength = 0, maxWordsLength = 0;
  12.  
  13.     printf("Введите длину массива разделителей: ");
  14.     scanf("%d", &delimitersLength);
  15.  
  16.     char delimitersArray[delimitersLength];
  17.  
  18.     printf("Введите символы-разделители: ");
  19.  
  20.     // начало считывания символов-разделителей
  21.     int c = EOF;
  22.     for (int i = 0; (c = getchar()) && i <= delimitersLength; i++) {
  23.         delimitersArray[i] = c;
  24.     }
  25.     // конец считывания символов-разделителей
  26.  
  27.     printf("Введите максимальное количество слов в тексте: ");
  28.     scanf("%d", &maxWordsLength);
  29.  
  30.     printf("Введите строку\n");
  31.     char *inputStr = readString(maxWordsLength, delimitersArray);                    // считываем строку
  32.  
  33.     if ((int) inputStr[0] % 2 == 0 && (int) inputStr[strlen(inputStr) - 1] % 2 == 0) {
  34.         char copyOfInpStr[strlen(inputStr)];
  35.         strcpy(copyOfInpStr, inputStr);                                 // копируем введенную строку, тк strtok разобьет ее на части
  36.         char *p = strtok(inputStr, delimitersArray), *shortestWord = p;
  37.         unsigned int
  38.             shortestWord_len = strlen(p),
  39.             shortestWord_index = 0,
  40.             word_length = strlen(p),
  41.             word_index = 0;
  42.  
  43.         // начало поиска самого короткого слова
  44.         while ((p = strtok(NULL, delimitersArray))) {
  45.             word_index += word_length + 1;
  46.             word_length = strlen(p);
  47.             if (strlen(p) <= shortestWord_len) {
  48.                 shortestWord_len = word_length;
  49.                 shortestWord = p;
  50.                 shortestWord_index = word_index;
  51.             }
  52.         }
  53.         // конец поиска самого короткого слова
  54.  
  55.         free(p);
  56.         p = NULL;
  57.  
  58.         char *firstPart = malloc(CHUNK_SIZE), *secondPart = malloc(CHUNK_SIZE);
  59.  
  60.         strncpy(firstPart, copyOfInpStr, shortestWord_index - 1);               // копируем введенную строку ДО разделителя слева от самого короткого слова
  61.         strncpy(
  62.                 secondPart,
  63.                 copyOfInpStr + shortestWord_index + shortestWord_len,
  64.                 strlen(copyOfInpStr) - shortestWord_index - shortestWord_len
  65.                 );                                                              // копируем строку после самого короткого слова
  66.  
  67.         char *resultString = malloc(strlen(copyOfInpStr));                                              // + 1, потому что к длине слова надо прибавить разделитель
  68.         strcat(resultString, firstPart);                                        // объединяем результирующую строку с первой частью
  69.         strcat(resultString, secondPart);                                       // объединяем результирующую строку со второй частью
  70.         resultString[strlen(resultString)] = '\0';                              // добавляем символ, обозначающий конец строки
  71.         printf("Строка с удаленным самым коротким словом: %s\n", resultString);
  72.        
  73.         free(firstPart);                                                        // очищаем память
  74.         firstPart = NULL;
  75.         free(secondPart);
  76.         secondPart = NULL;
  77.         free(firstPart);
  78.         firstPart = NULL;
  79.         free(resultString);
  80.         resultString = NULL;
  81.     }
  82.  
  83.     free(inputStr);
  84.     inputStr = NULL;
  85.  
  86.     return 0;
  87. }
  88.  
  89. char* readString(int maxWordsLength, const char *delimitersArray) {
  90.     unsigned int inputStr_len = CHUNK_SIZE;
  91.     int wordCounter = 0;
  92.     char *pString = malloc(CHUNK_SIZE);
  93.  
  94.     int c;
  95.     unsigned int i;
  96.     for (i = 0; (c = getchar()) && wordCounter < maxWordsLength; i++) {
  97.         if (c != '\n') {                        // игнорируем начало строки
  98.             pString[i] = c;
  99.             for (int j = 0; j < strlen(delimitersArray); j++) {
  100.                 if (c == delimitersArray[j]) {
  101.                     wordCounter++;
  102.                 }
  103.             }
  104.         } else {                                // если на вход поступил символ '\n', то необходимо уменьшить i, чтобы не нарушать порядок
  105.             i--;
  106.         }
  107.  
  108.         if (i == MAX_LENGTH) {
  109.             free(pString);
  110.         }
  111.  
  112.         if (i == inputStr_len) {                       // Блок заполнен
  113.             inputStr_len = i + CHUNK_SIZE;
  114.             pString = realloc(pString, inputStr_len);  // Расширяем блок на ещё один килобайт
  115.         }
  116.     }
  117.     pString[i] = '\0';                            // Признак конца строки
  118.     return pString;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement