Advertisement
Guest User

8

a guest
Mar 19th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.64 KB | None | 0 0
  1. // laba8zad2.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "stdio.h"
  6. #include "stdlib.h"
  7. #include "string.h"
  8. #include "conio.h"
  9. #include "windows.h"
  10.  
  11. #define BUFFER_SIZE 1024
  12. // дублирует слово word и заменяет по заданию
  13. void word_change(char *word, char *reword)
  14. {
  15.     memset(reword, 0, 20);                              //memset заполняет первые 20 символов reword 0
  16.     strncpy(reword, word + strlen(word) - 1, 1);        //strncpy копирует 1 байт word + strlen(word) - 1 в reword
  17.     strncat(reword, word, strlen(word) - 1);            //strncat добавить к концу reword  strlen(word) - 1 первых  символов из word
  18.  
  19.     char *buffer = (char *)malloc(sizeof(char) * 20);
  20.  
  21.     for (int i = 0; reword[i] != '\0'; i++)
  22.     {
  23.         //возвращает адрес символа c в строке s, начиная с хвоста, или NULL, если строка s не содержит символ c
  24.         if (((reword + i) != strrchr(reword, int(reword[i]))) && (strrchr(reword, reword[i]) != NULL)) // Если буква не единственная
  25.         {
  26.             memset(buffer, 0, 20);
  27.             strncpy(buffer, reword, strrchr(reword, (reword[i])) - reword);
  28.             strncat(buffer, strrchr(reword, (reword[i])) + 1, strlen(strrchr(reword, (reword[i]))) + 1);
  29.             memset(reword, 0, 20);
  30.             strncpy(reword, buffer, strlen(buffer));
  31.             i = 0;
  32.         }
  33.     }
  34. }
  35.  
  36. // Замена подстроки sub_str в строке str на  sub_str_rep.
  37. bool find_and_insert(char* &str, char* sub_str, char* sub_str_rep)
  38. {
  39.     char *buffer = NULL;                        // Буффер для
  40.     char *search_substr = 0;                    // Найденная подстрока
  41.     char Razdelitel[] = " !?/.,()[]{}";         // Символы разделители
  42.  
  43.                                                 // если входные данные есть и строка найдена
  44.     if (str && sub_str && sub_str_rep && strstr(str, sub_str))
  45.     {
  46.         // временный массив
  47.         buffer = (char*)malloc(sizeof(char) * BUFFER_SIZE);
  48.         if (!buffer)
  49.         {
  50.             printf("Не удалось выполнить операцию\n");
  51.             return FALSE;
  52.         }
  53.  
  54.         // чистим массив от мусора
  55.         memset(buffer, 0, strlen(str));
  56.  
  57.         strncpy(buffer, str, strlen(str) - strlen(strstr(str, sub_str)));
  58.         strcat(buffer, sub_str_rep);
  59.         strcat(buffer, strstr(str, sub_str) + strlen(sub_str));
  60.  
  61.         strcpy(str, buffer);
  62.  
  63.         // освобождаем память отведённую под массив
  64.         free(buffer);
  65.         return TRUE;
  66.     }
  67.     return FALSE;
  68. }
  69.  
  70. // Заменяет слова  в строке str на преобразованные
  71. void change(char *&str)
  72. {
  73.     char *str_copy = (char *)malloc(sizeof(char) * BUFFER_SIZE);        // Создаем копию строки
  74.     memset(str_copy, 0, BUFFER_SIZE);                                   // Очистка от мусора
  75.     strncpy(str_copy, str, strlen(str));                                // Копирование str->str_copy
  76.  
  77.     char *reword = (char *)malloc(sizeof(char) * 20);
  78.     char razdelitel[] = " !?/.,()[]{}";
  79.     char *word = strtok(str, razdelitel);
  80.  
  81.     while (word != NULL)
  82.     {
  83.         word_change(word, reword);
  84.         find_and_insert(str_copy, word, reword);
  85.  
  86.         word = strtok(NULL, razdelitel);
  87.     }
  88.     free(str);
  89.  
  90.     str = str_copy;
  91. }
  92.  
  93. int main()
  94. {
  95.     SetConsoleCP(1251);
  96.     SetConsoleOutputCP(1251);
  97.     char *Str = (char*)malloc(sizeof(char)*BUFFER_SIZE);
  98.     printf("Введите строку\n");
  99.     gets_s(Str, BUFFER_SIZE);
  100.     printf("\n");
  101.     change(Str);
  102.     puts(Str);
  103.     free(Str);
  104.     system("pause");
  105.     return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement