Cadenas de caracteres

Iniciado por Angel Zero, 3 Junio 2011, 07:23 AM

0 Miembros y 3 Visitantes están viendo este tema.

Angel Zero

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

CitarR[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
Zero

satu

Hola

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


int main()
{
.......
.......
int i;
i = strlen(R); // almacena en i la longitud de la cadena
R[i+1] = '\0'; // finalizamos la cadena
for(; i>P; i--) // vamos recorriendo la cadena de atrás hacia delante
    R[i] = R[i-1];
R[i] = T; // insertamos el nuevo caracter
..........
..........
return 0;
}


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:

for(i=P; i<strlen(R); i++)
    R[i] = R[i+1];


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

Saludos
Breakbeat como forma de vida

Mr.Blue

CitarR[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.

CitarCadana:
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.
CitarSalida:
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.

Angel Zero

#3
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...

Citarprintf("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
Zero

satu

#4
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 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...


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

int main ()
{
   char R[40], T;
   int P, i;

   printf("MENU STRING\n");
   printf("DIGITE EL STRING: ");
   scanf("%s", R);

   printf("Posicion caracter a insertar: ");
   scanf("%d",&P);

   while(getchar()!='\n') ;

   printf("Caracter a insertar: ");
   scanf("%c", &T);

   i = strlen(R); // almacena en i la longitud de la cadena
   R[i+1] = '\0'; // finalizamos la cadena

   for(; i>P-1; i--) // vamos recorriendo la cadena de atrás hacia delante
       R[i] = R[i-1];

   R[i] = T; // insertamos el nuevo caracter
   printf("%s", R);

   while(getchar()!='\n') ;

   return 0;
}


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

Saludos
Breakbeat como forma de vida

Angel Zero

#5
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
Zero

Acermax

Veo varias cosas mal, lo primero es que recorres mal el vector. Tu haces esto.

Código (cpp) [Seleccionar]

i = strlen(R);
for(;i=0;i++)
     {
     if (T=R)
      {
       M++;
       e=i;
      }


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 (cpp) [Seleccionar]

for (int i=0;i<strlen(R);i++)
o bien
for (int i=strlen(R);i>=0;i--)


Despues vuelves a hacer mal la comparación

Código (cpp) [Seleccionar]

if (T=R)
La comparación es '==', y además tienes que compararlo caracter a caracter
if (T==R[i])


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

Código (cpp) [Seleccionar]

e[M]=i;
M++;


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.

satu

#7
Cita de: Angel Zero en  3 Junio 2011, 23:35 PM
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
Breakbeat como forma de vida

Angel Zero

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
Zero

Acermax

A la hora de imprimir el resultado te estás pasando en el recorrido del array

Esto tienes tú.

   for(j=0; j<=M; j++)
{
 printf("%d ", e[j]);
}

Debería ser así

   for(j=0; j<M; j++)
{
 printf("%d ", e[j]);
}

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


if (T==R)
debería ser
if (T==R[i])