Advertisement
CherMi

Lab 11 final version

Nov 8th, 2019
274
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.05 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\\text.txt";
  14.     char *out_file_name = "C:\\test\\output.txt";
  15.     char *err_msg = "An error has occured";
  16.     char str[1024], *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.  
  43.     while (1)
  44.     {
  45.         if (fgets(str, 1024, in) == NULL)
  46.         {
  47.             if (feof(in)) //Конец файла
  48.             {
  49.                 fclose(in);
  50.                 fclose(out);
  51.                 break;
  52.             }
  53.             else //Ошибка
  54.             {
  55.                 perror(err_msg);
  56.                 fclose(in);
  57.                 fclose(out);
  58.                 return -2;
  59.             }
  60.         }
  61.  
  62.         ptr = str_process(str, &word_count);
  63.         fputs(ptr, out);
  64.     }
  65.     printf("Program finished successfully. Check %s for output.", out_file_name);
  66.     return 0;
  67. }
  68.  
  69. char *str_process(char *str, int *word_count)
  70. /*Функция удаляет нечётные слова,
  71. начинающиеся с заглавной буквы, меняет регистр остальных нечётных слов
  72. и увеличивает word_count на кол-во слов в строке до обработки*/
  73. {
  74.     char result[1024] = { '\0' };
  75.     char delim[] = " ,.;\t\n";
  76.     char *ptr, *str_begin;
  77.     char bad_str[1024];
  78.     int word_length, space_length;
  79.     int i;
  80.  
  81.     if (strlen(str) == 0) //Если пустая строка
  82.     {
  83.         return "";
  84.     }
  85.  
  86.     str_begin = str; //Указатель на текущее начало строки
  87.  
  88.     strcpy(bad_str, str_begin);
  89.     ptr = strtok(bad_str, delim);
  90.  
  91.  
  92.     while (1)
  93.     {
  94.         if (ptr == NULL)
  95.         {
  96.             break;
  97.         }
  98.         str_begin = strstr(str, ptr) + strlen(ptr);
  99.         *word_count += 1;
  100.         if (*word_count % 2 == 0) //Если чётное слово
  101.         {
  102.             strcat(result, ptr);
  103.             space_length = strspn(str_begin, delim);
  104.             strncat(result, str_begin, space_length);
  105.         }
  106.         else //Если нечётное слово
  107.         {
  108.             if(!isupper(*ptr)) //Если начинается не с буквы верхнего регистра, поменять регистр каждой буквы
  109.             {
  110.                 word_length = strlen(ptr);
  111.                 for (i = 0; i < word_length; i++)
  112.                 {
  113.                     if (isupper(ptr[i]))
  114.                     {
  115.                         ptr[i] = tolower(ptr[i]);
  116.                     }
  117.                     else
  118.                     {
  119.                         ptr[i] = toupper(ptr[i]);
  120.                     }
  121.                 }
  122.                 strcat(result, ptr);
  123.                 space_length = strspn(str_begin, delim);
  124.                 strncat(result, str_begin, space_length);
  125.             }
  126.         }
  127.         ptr = strtok(NULL, delim);
  128.     }
  129.     return result;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement