letras iniciales de una oracion en mayuscula

Iniciado por bobitttyy, 11 Abril 2015, 09:50 AM

0 Miembros y 1 Visitante están viendo este tema.

bobitttyy

si tengo la siguiente oración:
*esto es un mensaje
y quiero cambiarlo a :
*Esto Es Un Mensaje

#include <stdio.h>
int main (void) {
int n;
char cad[80],c;
cout<<"ingresa frase:\n";
gets(cad);
n=strlen(cad);
cad[0]=cad[0]-32;
for(int i=0;i<n-2;i++){
if (cad[i]== ' ' || cad[i]== '.' || cad[i]== ','){
cad[i+1] =cad[i+1]-32;
}
}
for(int i=0;i<n;i++){
cout<<cad[i];
}
cad[n]= '\0';
return 0;
}


pero esto solo me funciona solo para un espacio en blanco entre palabra y palabra. Yo quiero un metodo mas general.....con mas espacios en blanco, por ejemplo:

esto___es__un____mensaje
Esto___Es__Un____Mensaje

Stakewinner00

Podrías meter que en vez de
Citarif (cad== ' ' || cad== '.' || cad== ',')
, comprobar si es una letra o un número, y si no es ni una letra ni un número supones que es un "espacio" o lo que sea.

rarrav26

Proba cambiando
esto:
gets(cad);
por esto:
cin.getline(cad,80);

rir3760

#3
Cita de: bobitttyy en 11 Abril 2015, 09:50 AMYo quiero un metodo mas general.....con mas espacios en blanco
Lo primero que debes hacer es enfocarte en la biblioteca estándar de C++ evitando el uso de funciones como gets, mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

En cuanto al programa basta con utilizar una bandera de estado la cual pones a uno (o true) al encontrar un carácter parte de una palabra y cero (o false) cuando este sea un separador. Justo cuando la pones a uno cambias el carácter a mayúsculas (casi lo mismo que uno de los ejemplos de K&R).

Para darte una idea un programa en C con esa aproximación es:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void)
{
   char cad[] = "una   cadena de prueba   con multiples   espacios";
   int st;
   int i;

   printf("%s\n", cad);

   st = 0;
   for (i = 0; cad[i] != '\0'; i++)
      if (isspace(cad[i]))
         st = 0;
      else if (st == 0){
         st = 1;
         cad[i] = toupper(cad[i]);
      }
   printf("%s\n", cad);

   return EXIT_SUCCESS;
}


Toma la idea y adecuala a C++. Por ejemplo puedes empezar evitando el array utilizando en su lugar un objeto de la clase string y para leer la linea y almacenarla en ella utilizas la función getline.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Blaster

La aproximación que expones, presenta un comportamiento indefinido debido a que estas modificando un puntero que apunta a una cadena literal (linea 19)

Un Saludo

rir3760

Cita de: Blaster en 11 Abril 2015, 18:32 PMLa aproximación que expones, presenta un comportamiento indefinido debido a que estas modificando un puntero que apunta a una cadena literal (linea 19)
Ouch! Gracias por indicarlo, ya actualice el programa.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language