Sortowanie wyrazów w stringu.

Odpowiedz Nowy wątek
2014-12-15 02:07
0

Witam!

Męczę się nad jedną rzeczą, a dokładniej nad sortowaniem wyrazów w stringu.
Mój program dla danej wejściowej postaci: [5] aaa bbb uuu ddd eee ccc
ma zwrócić:
aaa bbb ccc ddd eee uuu

Oto co udało mi się spłodzić jak do tej pory:

 
            char *word;
            char *temp;
            char *words[30];
 
            i=-1;
            int j, k;
            word=strtok(buffor, "[5] ");
            while(word!=NULL){
                i++;
                words[i]=word;
                word=strtok(NULL, "[5] ");
            }
            printf("%d", i);
 
            for(j=0; j<i-2; j++){
                for(k=0; k<i-2; k++){
                    if(strcmp(words[k], words[k+1])>0){
                        strcpy(temp, words[k]);
                        strcpy(words[k], words[k+1]);
                        strcpy(words[k+1], temp);
                        puts(words[k]);
                        puts(words[k+1]);
                    }
                }
            }
 
            for(j=0; j<i-1; j++){
                strncat(buf2, words[j], strlen(words[j]));
                strncat(buf2, "-", 1);
            }

Problem jest taki, że sortowanie nie jest pełne (np. jeden wyraz będzie na złym miejscu), a czasami nawet w ogóle nie działa.
Z góry dziękuję za pomoc,
pozdrawiam!

Pozostało 580 znaków

2014-12-15 02:12
0
i=0;
for(word=strtok(buffor,"[5] ");word;word=strtok(NULL,"[5] ")) words[i++]=word;

Do sortowania użyj qsort.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2014-12-15 02:12

Pozostało 580 znaków

2014-12-15 08:14
0

Dzięki!

Mam ciągle jednak jeszcze jeden problem. Użyłem funkcji qsort w taki sposób:

 qsort(words, i, sizeof(char*), cmp);
int cmp(const void *a, const void *b){
    return strcmp(*(char**)a, *(char**)b);
} 

I porównywanie działa dobrze, ale zawsze na wyjściu jest jedna linia pusta.
Np. dla [5] zzzz uuuu dddd cccc aaaa
dostaję:

aaaa

cccc
dddd
uuuu
zzzz

Edit:
Problem rozwiązany. Tak na przyszłość, gdyby ktoś miał podobny problem: argumenty pobierałem funkcją fgets, która również pobiera znak nowej linii.
Tak więc wystarczyło dodać:

while(buf[i]!='\0')
    i++;
 
buf[i-1]='\0';

aby ją usunąć.

edytowany 2x, ostatnio: majkz, 2014-12-15 08:36

Pozostało 580 znaków

2014-12-15 13:12
0

Zamiast fgets pobieraj za pomocą scanf:

char buff[1000];
scanf("%999[^\n]s",buff);

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-15 13:35
0

Tak też chyba zrobię.

Mam jeszcze jeden problem, z którym nie mogę sobie poradzić.
A mianowicie, czy istnieje jakiś sposób na modyfikację stringa?
Mam n stringów postaci server_in_ImieNazwisko i chcę otrzymać każdego w postaci:
server_out_ImieNazwisko.

Próbowałem robić to na zasadzie dzielenia tych stringów na tokeny, ale wszelkie próby spełzły na niczym.
Z góry dziękuję za pomoc.
Ponownie :)

edytowany 1x, ostatnio: majkz, 2014-12-15 13:35

Pozostało 580 znaków

2014-12-15 14:14
0

string::find + string::replace


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0