Foro de elhacker.net

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
Código:
#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
Citar
if (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:
Código:
gets(cad);
por esto:
Código:
cin.getline(cad,80);


Título: Re: letras iniciales de una oracion en mayuscula
Publicado por: rir3760 en 11 Abril 2015, 17:42 pm
Yo 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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4.  
  5. int main(void)
  6. {
  7.   char cad[] = "una   cadena de prueba   con multiples   espacios";
  8.   int st;
  9.   int i;
  10.  
  11.   printf("%s\n", cad);
  12.  
  13.   st = 0;
  14.   for (i = 0; cad[i] != '\0'; i++)
  15.      if (isspace(cad[i]))
  16.         st = 0;
  17.      else if (st == 0){
  18.         st = 1;
  19.         cad[i] = toupper(cad[i]);
  20.      }
  21.   printf("%s\n", cad);
  22.  
  23.   return EXIT_SUCCESS;
  24. }

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
La 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