Слово "LiTTlE"
- единственное слово в строке, которое содержит последнюю букву в верхнем регистре.
Первое подвыражение оператора else if
p[i]>='A' && p[i]<='Z' && (p[i+1])!=tab
всегда будет оцениваться как истина, потому что символ p[i+1]
действительно не равен tab
. Таким образом, полное выражение всегда будет истинным.
Вместо логического оператора ИЛИ вы должны использовать логический оператор И в полном выражении этого оператора else if.
Например, это может выглядеть как
else if ( p[i] >= 'A' && p[i] <= 'Z' && p[i+1] != tab && p[i+1] != space && p[i+1] != '\0' )
Тем не менее программа выглядит плохо. Это не будет работать правильно, например, если вместо таблицы символов ASDII будет использоваться таблица символов EBCDI C.
Для начала не используйте magi c числа типа 32
. Используемые логические выражения слишком сложные. Вызов strlen
является избыточным.
Вот демонстрационная программа, которая показывает, как можно написать функцию.
#include <stdio.h>
#include <ctype.h>
char * rcapitalize( char *s )
{
for ( char *p = s; *p; ++p )
{
unsigned char c1 = p[0], c2 = p[1];
if ( isalpha( c1 ) )
{
if ( isspace( c2 ) || c2 == '\0' )
{
*p = toupper( c1 );
}
else if ( isupper( c1 ) )
{
*p = tolower( c1 );
}
}
}
return s;
}
int main(void)
{
char s[] = "a FiRSt LiTTlE TESt";
puts( rcapitalize( s ) );
return 0;
}
Результат программы:
A firsT littlE tesT