19/09/2019, 10:09:51 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias: LISTADO ACTUALIZADO DE CURSOS
 
 
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: Tratamiento de cadenas en C++  (Leído 1619 veces)
0 Usuarios y 1 Visitante están viendo este tema.
albertocai
La estupidez humana siempre tiende a infinito...
Pleno
****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 107


Gaditanae Sum!


Ver Perfil WWW
« : 07/03/2016, 06:32:40 pm »

Buenas a todos!
Estoy tratando de implementar un programa que, dada una cadena almacenada en la variable
Código:
char texto[100]
, inicializada con la frase "Me voy a comprar una casa con piscina", sea capaz de borrar los primeros n caracteres de la cadena (este parámetro se pide por pantalla).
Todo esto sin usar punteros.

Hasta ahora, lo que se me ha ocurrido es crear una cadena auxiliar y meterla en un bucle for que vaya desde la posición n+1 hasta strlen(texto) (longitud de la cadena texto) copiando carácter a carácter según la variable char letra[1].
Pero me hace un bucle infinito.
Copio el código (las variables están bien definidas en el programa, aunque aquí no se muestren):

Código:
char texto[100]="Me voy a comprar una casa con piscina";
        printf("Introduzca de cuantas letras sera su palabra: ");
scanf("%i", &i);
k=strlen(texto);
for(j=0; j<k-i; j++){
letra[0]=getchar(texto[j+i]);
printf("%s", letra[0]);
printf("replica[%i]=%s \n", j,replica[j]);
}
printf("La nueva cadena es: %s", replica);
system("pause");

¿Alguna sugerencia? Gracias!!  :risa:
En línea

...:::Si no me ha salido todavía es porque no me he abstraído lo suficiente:::...
luis
Pleno*
*****

Karma: +1/-0
Desconectado Desconectado

Sexo: Masculino
Uruguay Uruguay

Mensajes: 304


Ver Perfil
« Respuesta #1 : 08/03/2016, 11:05:27 pm »

supongo que con "borrar los primeros n caracteres de la cadena" quieres decir que si la cadena original es la que usas en la variable texto, y el n ingresado es cinco, debe devolver "y a comprar una casa con piscina".

observa que puedes usar el mismo arreglo texto para esa conversión; basta con asignarle a la posición cero la letra de la posición cinco, a la uno la de la posición seis, y así hasta que se termine la cadena.

pero esto funcionaría si la texto lo estás pensando precisamente como una cadena de texto que termina en \0. en caso que sean caracteres arbitrarios, no basta con frenar cuando se encuentra el fin del string, sino cuando se copian los 100-n (o 100-n+1, o 100-n-1; dejo el borde para tí) y hay que tener una política de cómo llenar los últimos n casilleros del arreglo.

también podrías querer decir que lo que quieres es devolver el texto  "     y a comprar una casa con piscina"; en ese caso lo que tienes que hacer es asignarles blancos a los n primeros caracteres del texto.

omití consideraciones acerca de si n podría ser mayor o  no que 100, o que el largo del texto. tu problema no aclara el punto, así que supongo que el n es "razonable".

saludos

luis
En línea
albertocai
La estupidez humana siempre tiende a infinito...
Pleno
****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 107


Gaditanae Sum!


Ver Perfil WWW
« Respuesta #2 : 08/03/2016, 11:49:15 pm »

Hola Luis,

Ante todo, un millón de gracias por tu respuesta.

En el día de hoy tuve clase con el profesor y éste dio una pista. Ya la práctica la tengo resuelta y la copio aquí (en este caso, este código forma parte de un switch (menú) que hace diferentes cosas a la cadena principal, almacenada en  char texto[dim], siendo const int dim=100:

   
Código:
        i=0;
while (texto[i]!=' ') //este bucle While localiza el primer espacio y guarda la posición en i
i++;
k=strlen(texto); //k guarda la longitud de la cadena
for(j=0; j<=k-i; j++)  //este bucle machaca los i primeros espacios de la cadena, copiando los caracteres posteriores
texto[j]=texto[j+i+1];
for (j=k-i; j<=k; j++) //sigue escribiendo i espacios en blanco
texto[j]=' ';
printf("La nueva cadena es: %s \n", texto);  //muestra la nueva cadena
system("pause");

Ahora aclaro que lo que hacemos para borrar es "machacar" lo que había escrito. Se hizo el cambio de tener que localizar la primera palabra de la cadena y borrarla, lo que se hace con el bucle while (localiza la posición el primer espacio en blanco de la cadena) y así podemos machacar recorriendo con el primer for lo que no se debe borrar (es decir, del espacio en adelante). Para que los "i" últimos caracteres no se repitan (ya que estamos contando "k-i" caracteres que no hay que borrar), entonces hay que sustituirlos por espacios en blanco, de nuevo machacamos con el carácter ' ' en el segundo bucle for. Para terminar, se muestra la cadena y se aplica una pausa para que el usuario la vea.

Mis explicaciones no son demasiado buenas, pero si lees con detenimiento el código y los comentarios (tras //) seguro que se entiende.

Un saludo,
Alberto.-
En línea

...:::Si no me ha salido todavía es porque no me he abstraído lo suficiente:::...
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.4 | SMF © 2006, Simple Machines LLC XHTML 1.0 válido! CSS válido!