Sortowanie wyrazów w stringu.

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!

0
i=0;
for(word=strtok(buffor,"[5] ");word;word=strtok(NULL,"[5] ")) words[i++]=word;

Do sortowania użyj qsort.

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ąć.

0

Zamiast fgets pobieraj za pomocą scanf:

char buff[1000];
scanf("%999[^\n]s",buff);
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 :)

0

string::find + string::replace

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