Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: bobitttyy en 11 Abril 2015, 09:50 AM

Título: letras iniciales de una oracion en mayuscula
Publicado por: bobitttyy en 11 Abril 2015, 09:50 AM
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
Título: Re: letras iniciales de una oracion en mayuscula
Publicado por: Stakewinner00 en 11 Abril 2015, 10:17 AM
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.
Título: Re: letras iniciales de una oracion en mayuscula
Publicado por: rarrav26 en 11 Abril 2015, 13:57 PM
Proba cambiando
esto:
gets(cad);
por esto:
cin.getline(cad,80);
Título: Re: letras iniciales de una oracion en mayuscula
Publicado por: rir3760 en 11 Abril 2015, 17:42 PM
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| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

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 (http://www.cplusplus.com/reference/string/string/) y para leer la linea y almacenarla en ella utilizas la función getline (http://www.cplusplus.com/reference/string/string/getline/).

Un saludo
Título: Re: letras iniciales de una oracion en mayuscula
Publicado por: Blaster en 11 Abril 2015, 18:32 PM
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
Título: Re: letras iniciales de una oracion en mayuscula
Publicado por: rir3760 en 11 Abril 2015, 19:48 PM
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