problema de cadenas en c

Iniciado por fernaEDLP, 11 Mayo 2018, 06:10 AM

0 Miembros y 1 Visitante están viendo este tema.

fernaEDLP

hola que tal? tengo un problema en c que dice lo siguiente: cree dos cadenas cad1 y cad2 que puedan alamacenar hasta 80 caracteres, y cad1 se pueda inicializar por teclado, copie el contenido den cad1 en cad2 sin que copie el contenido de las vocales, aclaración: no se pueden usar funciones,no c porque mo código no funciona, yo hice lo siguiente:
int main()
{
   int i,j;
   char cad1[80];
   char cad2[80];
   gets(cad1);
   while(cad1!='\0')
   {
       i++;
   }

       for(j=0;j<=i;j++)
       {
           if(cad1[j]=='a') (estoy probando con una sola vocal,ya se que van las otras)
           {
               cad1[j]=' ';
           }
       }
       for(j=0;j<=i;j++)
       {
           if(cad1[j]!=' ')
          {
           cad2[j]=cad1[j];
           }
       }

       puts(cad2);



return 0;
}

pd: no entiendo porque un estudiante de ingeneiría industrial tiene que estudiar c  :-[





Kenji-chan


int main(){
    int i,j;
    char cad1[80];
    char cad2[80];
    gets(cad1);
    while(cad1!='\0'){
/*este bucle while se seguira ejecutando mientras cad1 sea distinto que '\0'*/
        i++;//->aqui incrementamos el valor de i en 1 y dado que i nunca fue inicializado no sabemos cual es su valor inicial
    }//->cad1 nunca fue modificado asi que siempre sera distinto que '\0' y se repetira indefinidamente

    for(j=0;j<=i;j++){
         if(cad1[j]=='a') /*(estoy probando con una sola vocal,ya se que van las otras)*/{
             cad1[j]=' ';
         }
     }
    for(j=0;j<=i;j++){
         if(cad1[j]!=' '){
           cad2[j]=cad1[j];
         }
    }

    puts(cad2);



    return 0;
}

fernaEDLP

int main()
{
    int i=0,j;
    char cad1[80];
    char cad2[80];
    gets(cad1);
    while(cad1!='\0')
    {
        i++;
    }

        for(j=0;j<=i;j++)
        {
            if(cad1[j]=='a')
            {
                cad1[j]=' ';
            }
        }

        for(j=0;j<=i;j++)
        {
           if(cad1[j]!=' ')
          {
            cad2[j]=cad1[j];
           }
        }

        puts(cad2);



return 0;
}
hola kenji gracias por responder, pero lo acabo de modificar y me sigue sin funcar en el codeblocks, es decir cuando  meto la palabra la muestra en pantalla y no ocurre nada el el programa queda estatico.

pd:hoy rendí y creo queme rompieron el traste :(


Kenji-chan

#3

while(cad1!='\0'){
       i++;
}


esta parte del código hace que tu programa quede estático
eso es porque dentro del bucle while nunca cambias la posición de cad1
lo que tienes que hacer es


while(cad1[i]!='\0'){
       i++;
}

con esto le dices que la posiciona de cad1 avance y no se quede estático

fernaEDLP

#4
int main()
{
   int i=0,j;
   char cad1[80];
   char cad2[80];
   gets(cad1);
   while(cad1!='\0')
   {
       i++;
   }

       for(j=0;j<=i;j++)
       {
           if(cad1[j]=='a')
           {
               cad1[j]=' ';
           }
       }

       for(j=0;j<=i;j++)
       {
          if(cad1[j]!=' ')
         {
           cad2[j]=cad1[j];
          }
       }

       puts(cad2);



return 0;
}

tenes razón pero ahora pasa lo siguiente: cuando pongo por ejemplo hola me imprime hol, hasta ahi va todo bien si pongo armario me pone prm ?¿, si pongo grande me devuelve gr4nde es como si evaluara la vocal pero de mala manera, que opinas de la lógica de mi código es buena o es mala? tal vez el problema esta ahí gracias de nuevo, estoy editando el comentario pero sigue sin aparecer el

Kenji-chan

he encontrado 2 problemas aqui

for(j=0;j<=i;j++){/*-> a qui en j<=i, hola tiene 4 caracteres y es lo que vale i despues de salir del while, y cad1 tine 4 indices empezando desde 0
por lo tano cad1[0], cad1[1], cad1[2], cad1[3] son cuatro pero si le decimos que sea igual a cuatro nos incrementa en uno el indice cad1[4] que nos da un total de 5*/
            if(cad1[j]=='a'){
                cad1[j]=' ';
            }
        }
for(j=0;j<=i;j++){//> lo mismo aqui
           if(cad1[j]!=' '){
            cad2[j]=cad1[j];
/*aqui el string cad2[j] es sustituido por cad1[j], pero nunca pone el '\0'*/
           }
        }

fernaEDLP

#6
Cita de: Kenji-chan en 11 Mayo 2018, 21:01 PM
he encontrado 2 problemas aqui

for(j=0;j<=i;j++){/*-> a qui en j<=i, hola tiene 4 caracteres y es lo que vale i despues de salir del while, y cad1 tine 4 indices empezando desde 0
por lo tano cad1[0], cad1[1], cad1[2], cad1[3] son cuatro pero si le decimos que sea igual a cuatro nos incrementa en uno el indice cad1[4] que nos da un total de 5*/
           if(cad1[j]=='a'){
               cad1[j]=' ';
           }
       }
for(j=0;j<=i;j++){//> lo mismo aqui
          if(cad1[j]!=' '){
           cad2[j]=cad1[j];
/*aqui el string cad2[j] es sustituido por cad1[j], pero nunca pone el '\0'*/
          }
       }

entendí las 2 primeras correciones pero la del '\0' no la entendí,  no se supone que cuando recorro desde j=0 hasta j<i estaría recorriendo hasta el final de la cadena?, o el '\0' sirve también como un break? perdon por mi lentitud estoy hecho percha necesito una siesta

Kenji-chan

si funciona de forma cimilar
ademas se me olvidabaotra cosa

for(j=0;j<=i;j++){
          if(cad1[j]!=' '){
           cad2[j]=cad1[j];
/*a qui la la escritura del cad2 no es correcta*/
          }
       }


ejemplo con 'armario'

en cad1 todas las 'a' son ' '(espacio en blanco)

por lo tanto

cad2[j] -> 0 -> no pones nada y se queda con lo que ya avía hai
cad2[j] -> 1 -> r
cad2[j] -> 2 -> m
cad2[j] -> 3 -> nada
cad2[j] -> 4 -> r
cad2[j] -> 5 -> i
cad2[j] -> 6 -> o
cad2[j] -> 7 -> '\0' esto tendia que ir al final

fernaEDLP

int main()
{
    int i=0,j,k,l=0;
    char cad1[80];
    char cad2[80];
    gets(cad1);
    while(cad1!='\0')
    {
        i++;
    }

        for(j=0;j<i;j++)
        {
            if(cad1[j]=='a'||cad1[j]=='e'||cad1[j]=='i'||cad1[j]=='o'||cad1[j]=='u'||cad1[j]=='A'||cad1[j]=='E'||cad1[j]=='O'||cad1[j]=='U'||cad1[j]=='I')
            {
                cad1[j]=' ';
            }
        }
        for(k=0;cad1[k];k++)
        {
            cad2[l]=cad1[k];
            l++;
            cad2[l]='\0';

        }

        puts(cad2);



return 0;
}
hola kenji gracias por la ayuda ya lo pude resolver, te hago una última pregunta el hecho de poner cad2[l]='\0'; implica que eso se va a agregar al final de la copia de cad1 en cad 2?

Kenji-chan

si ya lo tienes solo te hace falta algo


int main(){
    int i=0,j,k,l=0;
    char cad1[80];
    char cad2[80];
    gets(cad1);
    while(cad1!='\0'){
        i++;
    }

        for(j=0;j<i;j++){
            if(cad1[j]=='a'||cad1[j]=='e'||cad1[j]=='i'||cad1[j]=='o'||cad1[j]=='u'||cad1[j]=='A'||cad1[j]=='E'||cad1[j]=='O'||cad1[j]=='U'||cad1[j]=='I'){
                cad1[j]=' ';//-> a qui haces que cad1[j] sea igual a ' '(espacio en blanco)
            }
        }
        for(k=0;cad1[k];k++){
/*aqui te hace falta quitar los espacios en blancos que dejaste en cad1 con un if != ' ' bastara para eso*/
            cad2[l]=cad1[k];
            l++;
            cad2[l]='\0';

        }

        puts(cad2);



return 0;
}