Advertisement
Guest User

sosihuy

a guest
Oct 21st, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.30 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<ctype.h>
  3. #include<cstring>
  4.  
  5. const int MAX_WORD_LEN = 32,    //  Константа задающая максимальную длинну слова
  6.           MAX_INPUT_LEN = 1024; //  Константа задающая максимальную длинну строки ввода
  7.     //  Можно поменять если нужно будет обрабатывать слова/строку длиннее
  8.  
  9. //  Функция принимающая на себя указатель на строку s и по ссылке позицию i
  10. //  Создаёт строку в которую копирует слово начинающееся в позиции i
  11. //  И возвращает указатель на эту строку
  12. char* get_word(const char *s, int &i){
  13.  
  14.     char *r = new char[MAX_WORD_LEN + 1];   //  Создаём строку r
  15.                                             //  Выделяем под неё MAX_WORD_LEN памяти
  16.                                             //  + 1 байт для хранения маркера конца строки
  17.     int rlen = 0;   //  Переменная содержашая текущую длинну строки r
  18.  
  19.     for (; isalnum(s[i]); ++i){ //  Идём по строке s пока символ s[i] буква или цифра
  20.         r[rlen++] = s[i];   //  Добавляем в конец строки r символ s[i]
  21.                             //  И увеличиваем rlen на 1
  22.     }
  23.  
  24.     r[rlen] = '\0'; //  В конец строки r добавляем маркер конца строки
  25.  
  26.     return r;   //  Возвращаем указатель на строку r
  27.  
  28. }
  29.  
  30. //  Функция добавляющая слово w в результат r
  31. //  Принимает указатель на строку результата r, и по ссылке её длинну rlen
  32. //  А так же указатель на вставляемое слово w
  33. void add_word(char *r, int &rlen, const char *w){
  34.  
  35.     int wlen = strlen(w);   //  Запоминаем размер строки w в переменную wlen
  36.     for (int i = 0; i < wlen; ++i){ //  Идём по слову посимвольно
  37.         r[rlen++] = w[i];           //  И добавляем к результату
  38.     }
  39.     for (int i = wlen - 1; i >= 0; --i){    //  Идём по слово посимвольно
  40.                                             //  Только теперь с конца в начало
  41.         r[rlen++] = w[i];                   //  И добавляем к результату
  42.     }
  43.  
  44. }
  45.  
  46. int main(){
  47.  
  48.     char *in = new char[MAX_INPUT_LEN + 1]; //  Создаём строку in для хранения входных данных
  49.                                             //  Выделяем под неё MAX_INPUT_LEN памяти
  50.                                             //  + 1 байт для хранения маркера конца строки
  51.     gets(in);   //  Читаем строку с консоли, записываем в in
  52.     int inlen = strlen(in); //  Запоминаем длинну строки in в переменную inlen
  53.  
  54.     char *r = new char[MAX_INPUT_LEN * 2 + 1];  //  Создаём строку r для хранения результата
  55.                                                 //  Выделяем под неё с запасом MAX_INPUT_LEN * 2 памяти
  56.                                                 //  + 1 байт для хранения маркера конца строки
  57.     int rlen = 0;   //  Переменная содержашая текущую длинну строки r
  58.  
  59.     int i = 0;  //  Создаём переменную i которой будем идти по строке
  60.     while (i < inlen){  //  Идём до конца строки in содержащей входную строку
  61.         if (isalnum(in[i])){    //  Если i-ый символ строки - буква или цифра
  62.             char *w = get_word(in, i);  //  Создаём строку w содержащую текущее слово
  63.                                         //  Записываем в неё слово которое начинается в позиции i
  64.                                         //  При этом i становится равно позиции первого символа после слова
  65.             add_word(r, rlen, w);   //  Добавляем слово к результату
  66.             delete[] w; //  Освобождаем память выделенную под текущее слово
  67.         } else {    //  Если i-ый символ строки - не буква и не цифра
  68.             r[rlen++] = in[i++];    //  Добавляем его в конец нашего результата
  69.                                     //  После чего увеличиваем rlen и i на 1
  70.         }
  71.     }
  72.  
  73.     r[rlen] = '\0'; //  Ставим маркер конца строки в конец результата
  74.  
  75.     puts(r);    //  Выводим результат
  76.  
  77.     delete[] r, in; //  Освобождаем память выделенную под хранение строк ввода и результата
  78.  
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement