Código fuente de C para cambiar las primeras letras de las palabras de minúsculas a mayúsculas en una cadena

Tengo un código fuente de C, pero tengo un problema con él. Quiero convertir las primeras letras de las palabras en una cadena que escribo de minúsculas a mayúsculas, pero todas las letras cambian a mayúsculas. ¿Puedes ayudarme a resolver esto?

#include  #include  #include  void main() { char sentence[100]; int count, ch, i; int str[32]; printf("Enter a sentence \n"); for (i = 0; (sentence[i] = getchar()) != '\n'; i++) { ; } sentence[i] = '\0'; /* shows the number of chars accepted in a sentence */ count = i; printf("The given sentence is : %s", sentence); printf("\n Case changed sentence is: "); for (i = 0; i < count; i++) { ch = islower(sentence[i])? toupper(sentence[i]) : tolower(sentence[i]); putchar(ch); } getch(); } 

p.ej

Entrada: bienvenido a la universidad de Sharif

Salida deseada: Bienvenido a la Universidad de Sharif

Salida real: BIENVENIDO A LA UNIVERSIDAD DE SHARIF

Debe verificar si el carácter actual es un espacio y, luego, solo use el toupper del carácter después del espacio.

 ch = ' '; for (i = 0; i < count; i++) { ch = isspace(ch) ? toupper(sentence[i]) : tolower(sentence[i]); putchar(ch); } 

Pruebe el siguiente código. 🙂

 #include  #include  #define N 100 int main( void ) { char sentence[N]; char *p = sentence; printf( "Enter a sentence: " ); if ( !fgets( sentence, sizeof( sentence ), stdin ) ) sentence[0] = '\0'; printf( "\nThe given sentence is : %s", sentence ); do { while ( isblank( ( unsigned char )*p ) ) ++p; if ( islower( ( unsigned char )*p ) ) *p = toupper( *p ); while ( *p && !isblank( ( unsigned char )*p ) ) ++p; } while ( *p ); printf( "\nCase changed sentence is: %s", sentence ); return 0; } 

La salida es

 The given sentence is : welcome to Sharif university Case changed sentence is: Welcome To Sharif University 

Si su comstackdor no admite la función isblank entonces puede sustituirlo por isspace

Parece que un enfoque más correcto sería usar solo isalpha porque, en general, después de un espacio en blanco puede haber, por ejemplo, un dígito o puntuación.

 #include  #include  #define N 100 int main( void ) { char sentence[N]; char *p = sentence; printf( "Enter a sentence: " ); if ( !fgets( sentence, sizeof( sentence ), stdin ) ) sentence[0] = '\0'; printf( "\nThe given sentence is : %s", sentence ); do { while ( *p && !isalpha( ( unsigned char )*p ) ) ++p; if ( islower( ( unsigned char )*p ) ) *p = toupper( *p ); while ( isalpha( ( unsigned char )*p ) ) ++p; } while ( *p ); printf( "\nCase changed sentence is: %s", sentence ); return 0; } 

Si no desea cambiar la cadena original, el código se verá como

 #include  #include  #define N 100 int main( void ) { char sentence[N]; char *p = sentence; printf( "Enter a sentence: " ); if ( !fgets( sentence, sizeof( sentence ), stdin ) ) sentence[0] = '\0'; printf( "\nThe given sentence is : %s", sentence ); printf( "\nCase changed sentence is: " ); do { while ( *p && !isalpha( ( unsigned char )*p ) ) putchar( *p++ ); if ( islower( ( unsigned char )*p ) ) putchar( toupper( *p++ ) ); while ( isalpha( ( unsigned char )*p ) ) putchar( *p++ ); } while ( *p ); return 0; } 

Es necesario comprobar los caracteres que tienen un espacio anterior y en mayúsculas. También debe verificar el primer carácter, que es un caso especial, ya que no tiene un espacio que lo preceda.

 #include  #include  int main (void) { char str[] = "this is a test string"; int loop; for (loop=-1; loop<(int) strlen(str)-1; loop++) { // Possible upper case required? if (loop < 0 || str[loop]==' ') if (str[loop+1] >= 'a' && str[loop+1] <='z') str[loop+1] = (str[loop+1] - 'a') + 'A'; } printf ("string is : %s\n", str); return 0; } 

Salida:

 string is : This Is A Test String