Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Angel Zero en 3 Junio 2011, 07:23 am



Título: Cadenas de caracteres
Publicado por: Angel Zero en 3 Junio 2011, 07:23 am
jejeje, volvi :xD, con otro problemas...

Citar
#include<string.h>
#include<conio.h>
#include<stdio.h>
char R[40], T;
int P;
void main ()
{
 clrscr();
  gotoxy(32,4);printf("MENU STRING\n");
  gotoxy(24,8);printf("DIGITE EL STRING: ");
  fflush(stdin);
  gets(R);
  clrscr();
  printf("Posicion caracter a insertar: ");
  scanf("%d",&P);
  printf("Caracter a insertar: ");
  fflush(stdin);
  T=getchar();
  R[P]=T ;
  puts(R);
  getch();
}

lo que logre aqui, fue reemplazar un caracter en una posicion "X", por otro diferente en esta misma posicion, pero lo que necesito es "Añadir" y "Retirar" un caracter
Ejemplo:
Amerca..... añadir la "i" para que diga "America"
Ameriica... Retirar la "i" para que diga " America".

No se como hacerlo, tenia la idea de un

Citar
R[P+1]=T ;

Pero solo lograria reemplazar el caracter siguiente despues de "P". asi que ni idea de como se hace.

Gracias por la ayuda :D


Título: Re: Cadenas de caracteres
Publicado por: satu en 3 Junio 2011, 13:02 pm
Hola

Para hacer lo que pides debes recorrer la cadena desde el final hasta la posición que quieres y luego insertas. Un ejemplo:

Código
  1. int main()
  2. {
  3. .......
  4. .......
  5. int i;
  6. i = strlen(R); // almacena en i la longitud de la cadena
  7. R[i+1] = '\0'; // finalizamos la cadena
  8. for(; i>P; i--) // vamos recorriendo la cadena de atrás hacia delante
  9.    R[i] = R[i-1];
  10. R[i] = T; // insertamos el nuevo caracter
  11. ..........
  12. ..........
  13. return 0;
  14. }
  15.  

Y para quitar un caracter lo que debes hacer es recorrer la cadena desde la posición que quieres hasta el final sobrescribiendo los caracteres:
Código
  1. for(i=P; i<strlen(R); i++)
  2.    R[i] = R[i+1];
  3.  

Además debes tener en cuenta que main debe devolver un int para indicar al SO el resultado de su finalización y que no es bueno utilizar conio porque está en desuso. Léete esto (https://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)

Saludos


Título: Re: Cadenas de caracteres
Publicado por: Mr.Blue en 3 Junio 2011, 19:58 pm
Citar
R[i+1] = '\0';
Esto lo hace automaticamente cuando ingresas la cadena y das enter.

En general esta mal, satu, el codigo que pones hace esto.

Citar
Cadana:
amerca
Posicion a insertar:
4
Caracter:
i
Salida:
ameria

Reemplazas el caracter, no insertas.

Lo mismo pasaria si lo haces con el de retirar, quedaria.
Citar
Salida:
ameri ca

Creo que la mejor solucion a esto es dividir la palabra y guardarla en una cadena, para luego concatenar con strcat o  con strncat

Algo asi
guardar en una cadena grande, amer
en otra cadena, ca
hacer un t[0]=getchar();
y concatenar
strcat (cadenagrande, t); //queda amerI
strcat (cadenagrande,cadena)//queda ameriCA

Saludos.


Título: Re: Cadenas de caracteres
Publicado por: Angel Zero en 3 Junio 2011, 20:17 pm
pero entonces como corto el string. tenia pensado algo asi
un for que me valla guardando las posiciones i en una variable

Cambie el algoritmo.

Citar
#include<conio.h>
#include<stdio.h>
#include<string.h>
int i, j, k;
char c[40], d[40], f[40], t[40];
void main()
{
clrscr();
printf("Escriba String: ");
fflush(stdin);
gets(c);
i=strlen(c);
printf("Escriba la posicion: ");
fflush(stdin);
scanf("%d",&j);
for (i=1;i<j;i++)
{
d=c;
}
for (i=i;i>j;i--)
{
f=c;
}
printf("Escriba el caracter: ");
fflush(stdin);
gets(t);
strcat (d,t);
strcat (d,f);
clrscr();
printf("El nuevo string es: %s", d);
getch();
}

Ahora, no se que error hay, pero a mi me compila, pero no me imprime el resultado, llega hasta ahi...

Citar
printf("El nuevo string es: %s, d");

Haber, y solo me muestra el nuevo caracter que meti, nada mas.

Y pues me toca usar esas librerias pues la clase es turbo C, y no me permiten usar mas.
gracias por la respuesta :D


Título: Re: Cadenas de caracteres
Publicado por: satu en 3 Junio 2011, 22:12 pm
Hola

Acabo de probar lo que posteé antes y funciona perfectamente, lo unico que tienes que tener cuidado con la posición que indicas ya que se empieza a contar desde 0, pero se arregla con
Código
  1. for(; i>P-1; i--)

Aquí pongo el code entero para que lo pruebes y prueba a quitar R[i+1] = '\0'; haber qué pasa...

Código
  1. #include<string.h>
  2. #include<stdio.h>
  3.  
  4. int main ()
  5. {
  6.    char R[40], T;
  7.    int P, i;
  8.  
  9.    printf("MENU STRING\n");
  10.    printf("DIGITE EL STRING: ");
  11.    scanf("%s", R);
  12.  
  13.    printf("Posicion caracter a insertar: ");
  14.    scanf("%d",&P);
  15.  
  16.    while(getchar()!='\n') ;
  17.  
  18.    printf("Caracter a insertar: ");
  19.    scanf("%c", &T);
  20.  
  21.    i = strlen(R); // almacena en i la longitud de la cadena
  22.    R[i+1] = '\0'; // finalizamos la cadena
  23.  
  24.    for(; i>P-1; i--) // vamos recorriendo la cadena de atrás hacia delante
  25.        R[i] = R[i-1];
  26.  
  27.    R[i] = T; // insertamos el nuevo caracter
  28.    printf("%s", R);
  29.  
  30.    while(getchar()!='\n') ;
  31.  
  32.    return 0;
  33. }
  34.  

Edito: se puede quitar
Código
  1. R[i+1] = '\0';
si ponemos esto
Código
  1. i = strlen(R)+1;

Saludos


Título: Re: Cadenas de caracteres
Publicado por: Angel Zero en 3 Junio 2011, 23:35 pm
Quedo muy bien, pero (aunque no creo que sea de importancia) si ingresas una cadena que lleve espacios en algun lado, y la posicion pasa del espacio, te pone el caracter al final de la primera linea...

pero ya asi esta bien.

Gracias por toda la ayuda

Edito:
Ahora tengo un problema nuevo

Citar
#include<conio.h>
#include<string.h>
#include<stdio.h>

void main ()
{
    clrscr();
    char R[40], T;
    int P, i, M, e[50];

    printf("MENU STRING\n");
    printf("DIGITE EL STRING SEPARANDOLO POR UN _: ");
    fflush(stdin);
    scanf("%s", R);
    i = strlen(R);
    printf("Caracter a BUSCAR: ");
    fflush(stdin);
    scanf("%c", &T);
    for(;i=0;i++)
     {
     if (T=R)
      {
       M++;
       e=i;
      }
     }
    printf("El string tiene %d veces el caracter ingresado, y sus posiciones son %d", M, e);
    getch();
}

lo que se pretende es alla un Caracter "X" en la linea que el usuario ingresa, como pueden ver trate de usar un vector, y tambien un acumulador... pero los resultados finales no son correctos.

muchas gracias :D


Título: Re: Cadenas de caracteres
Publicado por: Acermax en 4 Junio 2011, 05:21 am
Veo varias cosas mal, lo primero es que recorres mal el vector. Tu haces esto.

Código
  1. i = strlen(R);
  2. for(;i=0;i++)
  3.     {
  4.     if (T=R)
  5.      {
  6.       M++;
  7.       e=i;
  8.      }
  9.  

Eso es un bucle infinito, primero es que a i le das el valor del vector, es decir 40 y empiezas a sumar la 'i' hasta que 'i=0' (otra cosa que está mal, esto siempre será cierto, porque a 'i' le estas dando el valor 0, la comparación es hace con '==').

En definitiva, para recorrer el vector tienes 2 posibilidades.
Código
  1. for (int i=0;i<strlen(R);i++)
  2. o bien
  3. for (int i=strlen(R);i>=0;i--)
  4.  

Despues vuelves a hacer mal la comparación

Código
  1. if (T=R)
  2. La comparación es '==', y además tienes que compararlo caracter a caracter
  3. if (T==R[i])
  4.  

Finalmente debes añadir todas las posiciones al array e. Podrías hacerlo de esta manera.

Código
  1. e[M]=i;
  2. M++;
  3.  

Por cierto, no inicializas "M" al principio, eso podría darte problemas. Recuerda inicializar siempre las variables.

Y creo que no me dejo nada.

Un saludo.


Título: Re: Cadenas de caracteres
Publicado por: satu en 4 Junio 2011, 11:43 am
si ingresas una cadena que lleve espacios en algun lado, y la posicion pasa del espacio, te pone el caracter al final de la primera linea...

Eso pasa porque lees la cadena con scanf, utiliza fgets y ya podrás leer cadenas con espacios

Saludos


EDITO:

Este es mi mensaje nº 100

Sí, me hace ilusión


Título: Re: Cadenas de caracteres
Publicado por: Angel Zero en 4 Junio 2011, 18:19 pm
Listo, todo muy lindo, me imprime la cantidad y las posiciones, pero en las posiciones me esta imprimiendo un valor de mas

Citar
#include<conio.h>
#include<string.h>
#include<stdio.h>

void main ()
{
    clrscr();
    char R[40], T;
    int P, i, j, M=0, e[50];

    printf("MENU STRING\n");
    printf("DIGITE EL STRING SEPARANDOLO POR UN _: ");
    fflush(stdin);
    scanf("%s", R);
    printf("Caracter a BUSCAR: ");
    fflush(stdin);
    scanf("%c", &T);
    for(i=strlen(R);i>=0;i--)
     {
     if (T==R)
      {
       e[M]=i;
       M++;
      }
     }
    printf("El string tiene %d, y sus posiciones son: ", M);
    for(j=0; j<=M; j++)
 {
  printf("%d ", e[j]);
 }
 getch();
}

Digamos que le ingrese "asdfasdf", y le pedi que me buscara la "a", me dice que hay 2 y me dice que sus posiciones son 5 1 9... "9"... porque aparece ese 9, mostrando 3 posiciones, sabienddo que solo hay dos??

Gracias por toda la ayuda :D


Título: Re: Cadenas de caracteres
Publicado por: Acermax en 4 Junio 2011, 18:34 pm
A la hora de imprimir el resultado te estás pasando en el recorrido del array

Esto tienes tú.
Código
  1.    for(j=0; j<=M; j++)
  2. {
  3.  printf("%d ", e[j]);
  4. }
  5.  
Debería ser así
Código
  1.    for(j=0; j<M; j++)
  2. {
  3.  printf("%d ", e[j]);
  4. }
  5.  
Date cuenta que los arrays en C y C++ tienen el siguiente rango [0,N-1] y no [1,N]


De todas maneras me extraña que te funcione algo, porque sigues haciendo mal la comprobación

Código
  1. if (T==R)
  2. debería ser
  3. if (T==R[i])
  4.  


Título: Re: Cadenas de caracteres
Publicado por: Angel Zero en 4 Junio 2011, 18:38 pm
Listo, muchas gracias :D, me trabajo perfectamente, yo trabajo en turbo C, pero acabo de mirar, y a la hora de pegar el codigo aca, se me trago los [] y el contenido, me paso en la parte de arriba tambien...

si tengo probelmas en las demas cosas que me toca hacer, les estare escribiendo

GRACIAS :D