Обе функции, rev
и revwords
, неверны.
Например, в общем случае пользователь может передать пустую строку. В этом случае функция revwords
вызывает неопределенное поведение из-за начального условия в for l oop
for(int j=1;str[j] != '\0';j++){
Также, если переданная строка не содержит пробелов, то есть содержит только одно слово, тогда ничто не будет перевернуто.
В функции rev
условие l oop неверно
for(int i=from;i<= to/2;i++){
Например, если form
равно 3
и to
равно 5
, тогда выражение i <= to/2
дает 2
и l oop никогда не будет выполнено.
Кроме этого код, который меняет символы
temp = str[i];
str[to-i] = str[i];
str[to-i] = temp;
также неверно.
И, по крайней мере, функция revwords
должна иметь тип возвращаемого значения char *
в соответствии с соглашением стандартных C строковых функций.
Учтите, что Функция fgets
может добавить символ новой строки к введенной строке. Вы должны удалить его.
Вот демонстрационная программа, которая показывает, как функции могут быть реализованы. Я переименовал только имена функций.
#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\n";
char *p = s;
while ( *p )
{
p += strspn( p, delim );
if ( *p )
{
char *q = p;
p += strcspn( p, delim );
reverse( q, p - q );
}
}
return s;
}
int main(void)
{
enum { N = 100 };
char s[N];
printf( "Enter a sentence: " );
fgets( s, N, stdin );
// remove the appended new line character '\n'
s[ strcspn( s, "\n" ) ] = '\0';
puts( s );
puts( reverse_by_words( s ) );
return 0;
}
Вывод программы может выглядеть как
Enter a sentence: hello im here to help you
hello im here to help you
olleh mi ereh ot pleh uoy