DarkDevourer

ЯВУ - 11. Финальная версия

Nov 21st, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.21 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5. #include <locale.h>
  6.  
  7. char *str_process(char *str, int *word_count);
  8.  
  9. int main()
  10. {
  11. setlocale(LC_ALL, "RUSSIAN");
  12. FILE *in, *out;
  13. char *in_file_name = "C:\\test\\file.txt";
  14. char *out_file_name = "C:\\test\\outputlab11.txt";
  15. char *err_msg = "An error has occured";
  16. char str[1025], *ptr;
  17. int word_count = 0;
  18.  
  19.  
  20. if ((in = fopen(in_file_name, "rt")) == NULL) //Если входной файл не открылся для чтения
  21. {
  22. perror(err_msg);
  23. return -1;
  24. }
  25. if ((out = fopen(out_file_name, "wt")) == NULL) //Если выходной файл не создался для записи
  26. {
  27. fclose(in);
  28. perror(err_msg);
  29. return -1;
  30. }
  31.  
  32. fseek(in, 0, SEEK_END); //Проверка файла на пустоту
  33. if (ftell(in) == 0)
  34. {
  35. printf("The file is empty");
  36. fclose(in);
  37. fclose(out);
  38. remove(out_file_name);
  39. return 0;
  40. }
  41. fseek(in, 0, SEEK_SET);
  42. while (1)
  43. {
  44. if (fgets(str, 1024, in) == NULL)
  45. {
  46. if (feof(in)) //Конец файла
  47. {
  48. fclose(in);
  49. fclose(out);
  50. break;
  51. }
  52. else //Ошибка
  53. {
  54. perror(err_msg);
  55. fclose(in);
  56. fclose(out);
  57. return -2;
  58. }
  59. }
  60.  
  61. ptr = str_process(str, &word_count);
  62. fputs(ptr, out);
  63. }
  64. printf("Program finished successfully. Check %s for output.", out_file_name);
  65. return 0;
  66. }
  67.  
  68. char *str_process(char *str, int *word_count)
  69. /*Функция удаляет нечётные слова,
  70. начинающиеся с заглавной буквы, меняет регистр остальных нечётных слов
  71. и увеличивает word_count на кол-во слов в строке до обработки*/
  72. {
  73. char result[1024] = { '\0' };
  74. char delim[] = " ,.;\t\n";
  75. char *ptr, *str_begin;
  76. char bad_str[1024];
  77. int word_length, space_length;
  78. int i;
  79.  
  80. if (strlen(str) == 0) //Если пустая строка
  81. {
  82. return "";
  83. }
  84.  
  85. str_begin = str; //Указатель на текущее начало строки
  86.  
  87. strcpy(bad_str, str_begin);
  88. ptr = strtok(bad_str, delim);
  89.  
  90.  
  91. while (1)
  92. {
  93. if (ptr == NULL)
  94. {
  95. break;
  96. }
  97. str_begin = strstr(str, ptr) + strlen(ptr);
  98. *word_count += 1;
  99. if (*word_count % 2 == 0) //Если чётное слово
  100. {
  101. strcat(result, ptr);
  102. space_length = strspn(str_begin, delim);
  103. strncat(result, str_begin, space_length);
  104. }
  105. else //Если нечётное слово
  106. {
  107. if (!isupper((*ptr & 0xFF))) //Если начинается не с буквы верхнего регистра, поменять регистр каждой буквы
  108. {
  109. word_length = strlen(ptr);
  110. for (i = 0; i < word_length; i++)
  111. {
  112. if (isupper((ptr[i] & 0xFF)))
  113. {
  114. ptr[i] = tolower((ptr[i] & 0xFF));
  115. }
  116. else
  117. {
  118. ptr[i] = toupper((ptr[i] & 0xFF));
  119. }
  120. }
  121. strcat(result, ptr);
  122. space_length = strspn(str_begin, delim);
  123. strncat(result, str_begin, space_length);
  124. }
  125. }
  126. ptr = strtok(NULL, delim);
  127. }
  128. if (strchr(result, '\n') == NULL)
  129. {
  130. result[strlen(result)] = '\n';
  131. result[strlen(result) + 1] = '\0';
  132. }
  133. return result;
  134. }
Add Comment
Please, Sign In to add comment