serd2011

225690317

Jul 28th, 2021
498
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2.  
  3. char* reverseStringByWords(const char* str, char delim);
  4.  
  5. int main() {
  6.     char str[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor";
  7.     char* reversed = reverseStringByWords(str, ' ');
  8.     std::cout << str << std::endl << reversed << std::endl;
  9.     delete[] reversed;
  10. }
  11.  
  12.  
  13. void copyWord(const char* begin, const char* end, char* dest);
  14.  
  15. char* reverseStringByWords(const char* str, char delim) {
  16.     size_t size = strlen(str);
  17.     if (size == 0) return nullptr;
  18.     char* result = new char[size + 1]; // +1 для \0
  19.  
  20.     const char* srcPtr = str + size;
  21.     const char* wordEnd = srcPtr;
  22.     char* dest = result;
  23.  
  24.     srcPtr--; // пропускаем \0
  25.  
  26.     while (srcPtr != str) {                         // Идем по строке в обратном направлении пока не дойдем до начала
  27.         if (*srcPtr == delim) {                     // Если нашли разделитель (пробел)
  28.             copyWord(srcPtr + 1, wordEnd, dest);    // Копируем слово в новую строку          
  29.             dest += wordEnd - srcPtr - 1;           // Переходим в конец слова в копии строки
  30.             *dest++ = *srcPtr;                      // Копируем сам разделитель
  31.             wordEnd = srcPtr;
  32.         }
  33.         srcPtr--;                                   // Переходим к предыдущему символу
  34.     }
  35.     copyWord(srcPtr, wordEnd, dest);                // Копируем первое слово
  36.     dest += wordEnd - srcPtr;
  37.     *dest++ = '\0';                                 // Добавляем терминатор в конец строки
  38.  
  39.     return result;
  40. }
  41.  
  42. void copyWord(const char* begin, const char* end, char* dest) {
  43.     while (begin != end) {
  44.         *dest++ = *begin++;
  45.     }
  46. }
  47.  
RAW Paste Data