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
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.
Proba cambiando
esto:
gets(cad);
por esto:
cin.getline(cad,80);
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
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
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