Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.50 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. const size_t StartSize = 15;
  6. const size_t increase = 2;
  7. int F = 0;
  8. /*
  9. Мирзоева Умджат АПО-12
  10. ИЗ1
  11. Составить программу построчной обработки текста. Суть обработки - приведение каждого символа в
  12. каждой строке к нижнему регистру.
  13. Программа считывает входные данные со стандартного ввода, и печатает результат в стандартный вывод.
  14. Процедура приведения к нижнему регистру должна быть оформлена в виде отдельной функции,
  15. которой на вход подается массив строк (который необходимо обработать),
  16. количество переданных строк, а также указатель на переменную, в которой необходимо разместить
  17. результат - массив уже обработанных строк.
  18. В качестве возвращаемого значения функция должна возвращать количество строк,
  19. содержащихся в результирующем массиве.
  20. Программа должна уметь обрабатывать ошибки - такие как неверные входные данные
  21. (отсутствие входных строк) или ошибки выделения памяти и т.п.
  22. В случае возникновения ошибки нужно выводить об этом сообщение "[error]" и завершать выполнение
  23. программы. */
  24.  
  25. char* OneString() {
  26. size_t size = StartSize;
  27. char* string = (char*)calloc(sizeof(char), size);
  28. if (string == NULL){
  29. free(string);
  30. return NULL;
  31. }
  32. fgets(string, size, stdin);
  33. size_t j = strlen(string);
  34. if (strlen(string) == 1 && (string[0] = '\n' || string[0] == EOF)){
  35. free(string);
  36. return NULL;
  37. }
  38. if (string[j-1] != '\n') {
  39. size *= increase;
  40. char* res = (char*) realloc(string, sizeof(char) * size);
  41. if (res == NULL) {
  42. free(string);
  43. free(res);
  44. return 0;
  45. }
  46. string = res;
  47. F = 1;
  48. } else {
  49. F = 0;
  50. string[j-1] = '\0';
  51. }
  52. return string;
  53. }
  54.  
  55.  
  56. void FreeAll(int size, char **array){
  57. for (int i = 0; i < size; i++){
  58. free(array[i]);
  59. }
  60. free(array);
  61. }
  62.  
  63. char** AllStrings(int *StrSize) {
  64. size_t size = StartSize;
  65. char** strings = (char**)calloc(sizeof(char*), size);
  66. if (strings == NULL){
  67. (*StrSize) = 0;
  68. return 0;
  69. }
  70. int i;
  71. char *string = OneString();
  72. for (i = 0; !feof(stdin) && !ferror(stdin); i++) {
  73. if (string == NULL || string[0] == '\0') {
  74. free(string);
  75. return strings;
  76. }
  77. //увеличиваем размер массива по необходимости
  78. if (i >= size) {
  79. size *= increase;
  80. char** res = (char**) realloc(strings, sizeof(*strings) * size);
  81. if (res == NULL) {
  82. FreeAll(size/increase, strings);
  83. FreeAll(size, res);
  84. free(string);
  85. return 0;
  86. }
  87. strings = res;
  88. FreeAll(size, res);
  89. }
  90. //добавляем строку
  91. size_t Size = StartSize;
  92. while (F == 1){
  93. char* letter = OneString();
  94. Size *= increase;
  95. char * ans = strcat(string, letter);
  96. char* res = (char*) realloc(ans, sizeof(*strings) * size);
  97. if (res == NULL) {
  98. free(string);
  99. free(res);
  100. return 0;
  101. }
  102. string = res;
  103. }
  104. strings[i] = string;
  105. string = OneString();
  106. (*StrSize)++;
  107. }
  108. //освобождаем память, если вдруг на вход не было подано ничего
  109. if (ferror(stdin) || (i == 0 && string == NULL) ) {
  110. FreeAll(i, strings);
  111. free(string);
  112. return NULL;
  113. }
  114. if (string != NULL) {
  115. //увеличиваем размер массива по необходимости
  116. if (i >= size) {
  117. size += 1;
  118. char** res = (char**) realloc(strings, sizeof(*strings) * size);
  119. if (res == NULL) {
  120. FreeAll(size/increase, strings);
  121. FreeAll(size, res);
  122. free(string);
  123. return 0;
  124. }
  125. strings = res;
  126. FreeAll(size, res);
  127. }
  128. //добавляем строку
  129. strings[i++] = string;
  130. (*StrSize)++;
  131. }
  132. return strings;
  133. }
  134. char** ToLowerCase(const char *const *strings, int *StrSize) {
  135. if (strings == NULL || * StrSize == 0) {
  136. return 0;
  137. }
  138. char** answer_strings = (char**)malloc(sizeof(char*) * *StrSize);
  139. if (answer_strings == NULL){
  140. return 0;
  141. }
  142. size_t i;
  143. for (i = 0; i < *StrSize; ++i) {
  144. size_t cur_size = strlen(strings[i]);
  145. answer_strings[i] = (char*)calloc(sizeof(char), cur_size + 1);
  146. size_t k;
  147. for (k = 0; k < cur_size + 1; ++k) {
  148. if (strings[i][k] >= 'A' && strings[i][k] <= 'Z'){
  149. answer_strings[i][k] = strings[i][k] + 'a' - 'A';
  150. }
  151. else {
  152. answer_strings[i][k] = strings[i][k];
  153. }
  154. }
  155. }
  156. return answer_strings;
  157. }
  158.  
  159. int check(int check){
  160. if (check == 0){
  161. printf("[error]");
  162. return 0;
  163. }
  164. return 1;
  165. }
  166.  
  167. int main(){
  168. //считываем строки
  169. int StrSize = 0;
  170. char** incoming = (AllStrings(&StrSize));
  171. if (check(StrSize) == 0) {
  172. return 0;
  173. }
  174. //приводим к нижнему регистру
  175. char** answer = ToLowerCase((const char *const *) incoming, &StrSize);
  176. if (check(StrSize) == 0){
  177. return 0;
  178. }
  179. //выводим на экран
  180. for (int i = 0; i < StrSize; ++i) {
  181. printf("%s", answer[i]);
  182. printf("\n");
  183. }
  184. //освобождаем память
  185. FreeAll(StrSize, incoming);
  186. FreeAll(StrSize, answer);
  187. return 0;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement