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 no lo decidí dejar asi como está, porque si pongo el if con cad[j}!=' ' ocurre que si el usuario me digita una frase con espacios por ejemplo "hola que tal", el programa me devuelve hlqtl, y no entendería que es lo que hace, en cambio si directamente copio el contenido de cad1 en cad2 me devuelve hl q tl, quedaria más claro así

Kenji-chan

si pero dejar así el programa es muy poco elegante ya que la longitud del estring cad2 se ve reducida por 80-(n_vocales) alterando su tamaño original paa esto te propongo 2 soluciones, la primero usar un carácter que se use poco o no se use en una oración como por ejemplo un '*' de modo que

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 '*'
            }
        }
        for(k=0;cad1[k];k++){
            if(cad1[k] != '*'){
                cad2[l]=cad1[k];
                l++;
                cad2[l]='\0';
            }
        }

        puts(cad2);



return 0;
}


la segundo consiste en cambiar un poco la filosofía del programa

quita_vocales.c

#include <stdio.h>

int main(int arv, char* argc[]){
int i = 0, j = 0;
char cad1[80], cad2[80];

gets(cad1);

while(cad1[i] != '\0'){
if(cad1[i] == 'a' || cad1[i] == 'A' ||
   cad1[i] == 'e' || cad1[i] == 'E' ||
   cad1[i] == 'i' || cad1[i] == 'I' ||
   cad1[i] == 'o' || cad1[i] == 'O' ||
   cad1[i] == 'u' || cad1[i] == 'U'){
i++;
continue;
/*mientras sea una vocal pasamos de ella*/
}
else{
cad2[j] = cad1[i];
j++;
cad2[j] = '\0';
/*si no es una vocal la almacenamos en cad2*/
}
i++;
}

puts(cad2);

getchar();
return 0;
}


aquí como veras envés de sacar la longitud del estring cad1 sacamos las vocales minetras escaneamos el string cad1

la sentencia continue
Citar
Fuerza a que comience una nueva vuelta dentro de la estructura correspondiente. Dentro de los ciclos
while, y do-while, se evalúa la condición de salida; en el for, se efectúa un salto a la expresión de incremento.
Se utiliza para saltarse el resto de la pasada actual a través de un bucle. El bucle no termina cuando se encuentra una sentencia continue, sencillamente no se ejecutan las sentencias que se encuentren a continuación en él, y se salta directamente a la siguiente pasada a través del bucle.

fernaEDLP

Cita de: Kenji-chan en 12 Mayo 2018, 19:08 PM
si pero dejar así el programa es muy poco elegante ya que la longitud del estring cad2 se ve reducida por 80-(n_vocales) alterando su tamaño original paa esto te propongo 2 soluciones, la primero usar un carácter que se use poco o no se use en una oración como por ejemplo un '*' de modo que

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 '*'
            }
        }
        for(k=0;cad1[k];k++){
            if(cad1[k] != '*'){
                cad2[l]=cad1[k];
                l++;
                cad2[l]='\0';
            }
        }

        puts(cad2);



return 0;
}


la segundo consiste en cambiar un poco la filosofía del programa

quita_vocales.c

#include <stdio.h>

int main(int arv, char* argc[]){
int i = 0, j = 0;
char cad1[80], cad2[80];

gets(cad1);

while(cad1[i] != '\0'){
if(cad1[i] == 'a' || cad1[i] == 'A' ||
   cad1[i] == 'e' || cad1[i] == 'E' ||
   cad1[i] == 'i' || cad1[i] == 'I' ||
   cad1[i] == 'o' || cad1[i] == 'O' ||
   cad1[i] == 'u' || cad1[i] == 'U'){
i++;
continue;
/*mientras sea una vocal pasamos de ella*/
}
else{
cad2[j] = cad1[i];
j++;
cad2[j] = '\0';
/*si no es una vocal la almacenamos en cad2*/
}
i++;
}

puts(cad2);

getchar();
return 0;
}


aquí como veras envés de sacar la longitud del estring cad1 sacamos las vocales minetras escaneamos el string cad1

la sentencia continue
hola muy buena la segunda solución, no sabía de la sentencia continue, en la facu en el primer modulo no se dan funciones, es todo con diagrama de flujo punteros, arreglos y cadenas. En el segundo si damos todo lo que es memoria dinámica, funciones y demas...
pero creo que voy a tener que rendir de nuevo la primer parte  :( gracias igual seguramente en el futuro postee mas dudas