oshuej

Untitled

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