Ошибка в сортировке строки

я пытался сделать сортировку слов в строке по алфавиту но к сожаления не вышло ,подскажите что я не так делаю ?Прошу прошения если вопрос оформлен не корректно.

#include <iostream>
#include <cstring>
 
using namespace std;
 
void sortWord(char string[]);
 
int main()
{
    char str[256];
    string words[256];
    int start, end;
    int WordCounter = 0;
    size_t words_sz = 0;
    
    cout<<"Enter str:";
    gets(str);
    
    for(int i = 0; str[i] != '\0'; i++)
    {
        if(str[i] == ' ' || str[i] == '\0')
        {
            while(str[i] == ' ') i++;
            start = i;
            while(str[i] != ' ' && str[i] != '\0') i++;
            while(str[i] == ' ') i++;
            end = i;
            words[words_sz++] = string(start, end);
        }
    }
    string tmp;
    for(int j=0;j<words_sz;j++)
    {
        if(words[j]<words[j+1])
        {
        tmp=words[j];
        words[j]=words[j+1];
        words[j+1]=tmp;
        }
    }
    
    cout<<"Line view after sort words:";
    //puts(str);
    
    for(int j=0;j<words_sz;j++)
    {
        cout<<words[j];
    }
    return 0;
}

Тест


Ответы (1 шт):

Автор решения: Павел Ериков

У вас есть 2 проблемы:

  1. Проблема в том, что у вас массив words заполняется не правильно. Лучше когда парсите строку, работать с указателями. И зачем внутри цикла проверка if(str[i] == ' ' || str[i] == '\0')?

    Вот пример рабочего кода:

    char* s = str;
    char *start, *end;
    while(*s != '\0')
    {
        while (*s != '\0' && *s == ' ') ++s;
        start = s;
        while (*s != '\0' && *s != ' ') ++s;
        while (*s != '\0' && *s == ' ') ++s;
        end = s;
        words[words_sz++] = string(start, end);
    }
    
  2. Я думаю после того, как вы спарсили слова в массив words вы сортируете их алгоритмом пузырьком. Тогда у вас не правильно написан алгоритм:

    Вот пример рабочего кода:

    string tmp;
    for (int i = 0; i < words_sz - 1; i++) {
        for (int j = 0; j < words_sz - i - 1; j++) {
            if (words[j] > words[j + 1]) {
                tmp = words[j];
                words[j] = words[j + 1];
                words[j + 1] = tmp;
            }
        }
    }
    
→ Ссылка