Начало токенизации строки от последнего символа и продолжение до первого символа.Держите один указатель на якоре у основания текущего слова, а другой указатель, который будет уменьшаться, пока начало слова не найдено.Когда вы находите начало слова во время сканирования, как это, печатайте от указателя начала слова до якоря конца слова.Обновите привязку конца слова к предыдущему символу текущего начального символа слова.
При сканировании может потребоваться пропустить символы пробела.
ОБНОВЛЕНИЕ
Это быстрая реализация:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX_BUF 256
void show_string (char *str, int i, int n)
{
while (i <= n)
{
printf ("%c", str[i]);
i++;
}
}
int main (void)
{
char str[MAX_BUF];
int end_anchor, start_ptr;
int state;
printf ("\nEnter a string: ");
scanf (" %[^\n]", str);
start_ptr = strlen (str) - 1;
end_anchor = start_ptr;
state = 0;
while (start_ptr >= -1)
{
switch (state)
{
case 0:
if ((!isspace (str[start_ptr]) && (start_ptr >= 0)))
{
start_ptr--;
}
else
{
state = 1;
}
break;
case 1:
show_string (str, start_ptr + 1, end_anchor);
state = 2;
start_ptr--;
printf (" ");
break;
case 2:
if (!isspace (str[start_ptr]))
{
state = 0;
end_anchor = start_ptr;
}
else
{
start_ptr--;
}
break;
}
}
printf ("\n");
return 0;
}
end_anchor
указывает на каждое конечное слово, а start_ptr
находит начало слова, конец которого содержится в end_anchor
.Когда мы находим слово начало (по пробелам или start_ptr
= -1), мы печатаем все символы от start_ptr + 1
до end_anchor
.+ 1
обусловлен реализацией: start_ptr
указывает на символ пробела, а процедура печати будет печатать все символы от i
до n
.После того, как мы обнаружили одно пустое пространство, мы печатаем его и пропускаем соседние пробелы (в case 2
) и сохраняем только одно, которое печатается вручную.Как только не пропущено пробел, у нас есть другое слово end, для которого мы устанавливаем end_anchor
для этого индекса в case 2
и устанавливаем state = 0
, чтобы мы могли искать слово start снова.