Я просто скопирую мой хороший ответ из этого вопроса, который еще не был закрыт Переверните строку без strtok в C . Поэтому я не могу использовать эту ссылку, чтобы закрыть ваш вопрос как дубликат.
Стандартный подход заключается в обращении каждого слова в строке и затем в обратном порядке всей строки.
Стандарт C функция strtok
не подходит в этом случае. Вместо этого используйте стандартные C функции strspn
и strcspn
.
Вот и вы.
#include <stdio.h>
#include <string.h>
static char * reverse( char *s, size_t n )
{
for ( size_t i = 0; i < n / 2; i++ )
{
char c = s[ i ];
s[ i ] = s[ n - i - 1 ];
s[ n - i - 1 ] = c;
}
return s;
}
char * reverse_by_words( char *s )
{
const char *delim = " \t";
char *p = s;
while ( *p )
{
p += strspn( p, delim );
if ( *p )
{
char *q = p;
p += strcspn( p, delim );
reverse( q, p - q );
}
}
return reverse( s, p - s );
}
int main(void)
{
char s[] = "5 60 +";
puts( s );
puts( reverse_by_words( s ) );
return 0;
}
Вывод программы:
5 60 +
+ 60 5
Если вы Если вы хотите сохранить начальные и конечные пробелы, как они были в исходной строке, то функции могут выглядеть следующим образом
#include <stdio.h>
#include <string.h>
static char *reverse( char *s, size_t n )
{
for ( size_t i = 0; i < n / 2; i++ )
{
char c = s[i];
s[i] = s[n - i -1 ];
s[n - i - 1] = c;
}
return s;
}
char * reverse_by_words( char *s )
{
const char *delim = " \t";
char *first = s, *last = s;
for ( char *p = s; *p; )
{
p += strspn( p, delim );
if ( last == s ) first = last = p;
if ( *p )
{
char *q = p;
p += strcspn( p, delim );
last = p;
reverse( q, p - q );
}
}
reverse( first, last - first );
return s;
}
int main(void)
{
char s[] = "\t\t\t5 60 +";
printf( "\"%s\"\n", s );
printf( "\"%s\"\n", reverse_by_words( s ) );
return 0;
}
Вывод программы:
" 5 60 +"
" + 60 5"