Я пытаюсь изменить порядок слов в предложении на месте, например:
В этом предложении слова поменялись местами.
становится
в обратном порядке.Это предложения слов. Это
Это то, что у меня пока есть, и это почти работает: я использую функцию strrev, чтобы перевернуть строку, а затем функцию inprev, чтобы отправить каждое слово в функцию strrev по отдельности,повернуть их обратно к исходной ориентации, но в обратном порядке.Отправка указателя на начало и конец функции strrev может показаться немного глупой, но она позволяет использовать ту же функцию в inprev (), отправляя указатель на начало и конец отдельных слов.
#include <stdio.h>
#include <string.h>
void strrev(char * start, char * end);
void inprev(char * start);
int main(void)
{
char str[] = "Foobar my friends, foobar";
char * end = (str + strlen(str) -1);
puts(str);
strrev(str, end);
puts(str);
inprev(str);
puts(str);
return 0;
}
void strrev(char * start, char * end)
{
char temp;
while (end > start)
{
temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
void inprev(char * start)
{
char * first = start;
char * spcpnt = start;
while (*spcpnt)
{
while (*spcpnt != ' ' && *spcpnt)
spcpnt++;
strrev(start, spcpnt-1); // removing the -1 sends the space on the
start = spcpnt++; // other side to be reversed, doesn't stop
// the problem.
}
}
Вот вывод:
Foobar мои друзья, foobar
raboof, sdneirf ym rabooF
foobarfriends, мой Foobar
Проблема заключается в том, что отсутствие последнего пробела в конце последнего слова означает, что между этим словом и предыдущим в последней строке отсутствует пробел, и вместо этого его бросают в конец последнего слова,который был первым словом в оригинальной строке.Выделение пробела с другой стороны слова только переносит проблему в другое место.Кто-нибудь может увидеть решение?