Foros del Web » Programación para mayores de 30 ;) » C/C++ »

comparar cadenas de un archivo,imprime basura

Estas en el tema de comparar cadenas de un archivo,imprime basura en el foro de C/C++ en Foros del Web. Hola tengo dos problemas con mi codigo, por consola yo leo dos un entero y una cadena por ahora la opcion dos aun no la ...
  #1 (permalink)  
Antiguo 26/05/2015, 21:11
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 2 meses
Puntos: 0
comparar cadenas de un archivo,imprime basura

Hola tengo dos problemas con mi codigo, por consola yo leo dos un entero y una cadena por ahora la opcion dos aun no la desarrollo eso es despues, pero la primera opcion es que tengo que la cadena sera de un maximo valor de 50 digitos en binarios que de ahi tengo que tomar cada 5 digitos que representa un valor en binario.

de un archivo llamado "reglas.txt" contiene en cada línea alguna letra del abecedario (solo mayusculas) de la A-Z y numeros de 1-4

este es el ejemplo de como funciona:
reglas.txt

G 00000
Z 11001
K 00011
.
.
.
.
1 01110

Las letras en el archivo no necesariamente están en orden alfabético,
igualmente los números tampoco están en orden. La idea es que las cadenas de
entrada tengan un significado diferente según el archivo de reglas. Todas las letras y
números mencionados anteriormente deben estar incluidos en las reglas con su
respectiva codificación en binario.

Si la entrada fuera 1 00000110010111000000, se tiene que escribir el mensaje
decodificado en un archivo de salida, cada entrada es una línea en la salida. Para el
ejemplo anterior, en el archivo salida se escribe GZ1G. Todo esto con las reglas
definidas antes.

yo use printf para imprimir y ver si estaba haciendo todo correcto y si me imprime la letra pero me imprime tambien unas cosas extrañas :(

y mi otro problema es que ese primer arreglo que toma los 5 digitos agarro y lo comparo con la cadena que estara en el arreglo reglas.txt hasta que encuentre que son iguales, pero no se como hacer para que ese arreglo vuelva a picar 5 digitos de la cadena grande pero ahora de 5 a 9 lo que hice fue ponerle un contador que fuera sumando y siempre se sumara de 5 en cinco pero no se como podria hacer esa parte de que vaya probando cada 5 digitos ya la compracion la tengo pero esa parte no se

Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <stdio.h>  
  3. #include <math.h>  
  4. #include <string.h>
  5.  
  6. int main (int argc, char *argv[]) {
  7.     int i=0,j=0,k=0,l=0,m=0,n=0;
  8.     char bin[50],str1[5],letra,op,ArrSol[20]; //Donde se guarda resultado final,coloqué índice 20 por ser random en la vida
  9.  
  10.     int caracter,ret;
  11.     int v=0, z=5;
  12.     char array[5];
  13.     int conta;
  14.     FILE *reglas;
  15.  
  16.     scanf("%c %s",&op,bin);
  17.        
  18. if(op=='1'){ //Opción 1
  19.     reglas=fopen(argv[1],"r"); //abriendo archivo reglas
  20.    
  21.     while (bin[i]!= ' '){
  22.             for (v=0;v<z;v++){
  23.                 array[v]=bin[v];
  24.                 conta++;
  25.             }
  26.             i++; //Agregué esto
  27.     }// y esto
  28.    
  29.      if(reglas==NULL){
  30.      printf("Error en el archivo");
  31.      }else{
  32.         while (!feof(reglas)){
  33.             fscanf(reglas,"%c %s",&letra,&str1); //Aquí da un error que se resuelve colocando un índice-> &str1[j]
  34.                                                 //Pero igual guarda sin colocarle el índice
  35.             char word;
  36.              word=letra;
  37.              ret=strncmp(array,str1,5);
  38.            
  39.             if (ret==0){    
  40.              ArrSol[k]=letra;
  41.              printf("%s",ArrSol); //Coloqué que imprimiera para probar, si guarda la letra peeroo...
  42.             }
  43.         }
  44.        
  45.      
  46.       }
  47.  
  48.  
  49. }
  50.  
  51. fclose(reglas);
  52.  
  53. return 0;
  54. }
  #2 (permalink)  
Antiguo 27/05/2015, 01:25
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: comparar cadenas de un archivo,imprime basura

Código C:
Ver original
  1. while (bin[i]!= ' ')

¿Qué estás intentando aquí? ¿acaso la cadena termina con un espacio? seguramente no.

Si tu intención es iterar sobre "bin" hasta el final de la cadena el bucle tendría que parecerse más a esto:

Código C:
Ver original
  1. while (bin[i]!= '\0')

Ya que, como sabemos (o deberíamos saber), en C toda cadena termina SIEMPRE con el carácter nulo.

Por otro lado, analizando el contenido del bucle:

Código C:
Ver original
  1. while (bin[i]!= ' '){
  2.             for (v=0;v<z;v++){
  3.                 array[v]=bin[v];
  4.                 conta++;
  5.             }
  6.             i++; //Agregué esto
  7.     }

Tengo que volver a hacer la pregunta... ¿qué intentas aquí?

No entiendo por qué iteras sobre "bin" usando la variable "i" y luego, en cada iteración, copias los mismos 5 caracteres (v=0 hasta v<z) de "bin" a "array". Es decir:

Si bin contiene "AB" sucede lo siguiente:
  1. i=0
  2. bin[i]=='A', luego bin[i]!=' '
  3. array[0] = bin[0], bin[0]=='A'
  4. conta++, conta==1
  5. array[1] = bin[1], bin[1]=='B'
  6. conta++, conta==2
  7. array[2] = bin[2], bin[2]=='\0'
  8. conta++, conta==3
  9. array[3] = bin[3], bin[3]==???
  10. conta++, conta==4
  11. array[4] = bin[4], bin[4]==???
  12. conta++, conta==5
  13. i++, i==1
  14. bin[i]=='B', luego bin[i]!=' '
  15. Se ejecutan los pasos 3 a 12
  16. i++, i==2
  17. bin[i]=='\0', luego bin[i]!=' '
  18. Se ejecutan los pasos 3 a 12
  19. i++, i==3
  20. bin[i]==???, luego bin[i]!=' ' (lo más probable) o bin[i]==' ' (más improbable)
  21. Se ejecutan los pasos 3 a 12
  22. ...

Como puedes comprobar, ese código no funciona correctamente.

Además, tu código tiene algunos problemas más:

Código C:
Ver original
  1. while (!feof(reglas)){
"feof" no va a dar error hasta que no se realice una lectura errónea, luego si resulta que con el fscanf de la línea 33 se termina de leer el fichero, el siguiente feof retornará false, intentarás hacer otra vez fscanf y realizarás una lectura sucia (la siguiente vez feof si retornará true, pero habrás guardado en tu array código basura)

Código C:
Ver original
  1. fscanf(reglas,"%c %s",&letra,&str1)
Teniendo en cuenta que "str1" es un arreglo, ese "&" en "&str1" está mal. Si te hace lecturas incorrectas es por lo que te he comentado en el punto anterior.

Código C:
Ver original
  1. char word;
  2. word=letra;
¿Para qué usas "word"? absolutamente para nada, después de esa asignación no vuelves a hacer nada con esa variable

Código C:
Ver original
  1. ArrSol[k]=letra;
  2. printf("%s",ArrSol);
"ArrSol[k]=letra" es correcto, pero qué valor tiene "ArrSol[k+1]"? ¿es acaso '\0'? bueno, la probabilidad de que así sea es de 1 entre 256 así que te puedes hacer a la idea de que seguramente no sea '\0'. ¿Qué importancia tiene ese detalle? bueeeeno, si no fuese porque en la siguiente línea hacer un printf para volcar la cadena por pantalla posiblemente no pasaría nada, pero printf aplica la norma de las cadenas, que dice que ésta SIEMPRE acaba con el famoso carácter '\0'. Como tu cadena no tiene dicho carácter, "printf" imprimirá tu cadena y seguirá volcando caracteres de la memoria hasta que se encuentre con un nulo.

Por cierto, qué sucede si en tu archivo de reglas tienes los caracteres en el orden A B y la cadena de entrada resulta ser "BA"?? te adelanto una pista, no va a descrifrar el mensaje completo.

Yo en tu lugar lo primero que haría es leer el fichero de claves y almacenar su contenido en un array. Después, con las claves ya cargadas, procedería a iterar sobre "bin" para realizar las operaciones de cifrado-descrifrado.

Para almacenar la tabla, puedes usar una estructura del tipo:

Código C:
Ver original
  1. struct clave
  2. {
  3.   char textoPlano;
  4.   char cifrado[6]; // Nota que, para almacenar 5 caracteres, necesito un arreglo de tamaño 6
  5. };
  6.  
  7. struct clave claves[64]; // Con 5 caracteres binarios en la parte cifrada, el sistema no admite más que 64 claves diferentes

Si no te sabes manejar con structs (o no te dejan hacerlo todavía), puedes optar por usar dos arrays independientes, eso sí, cuida que estén perfectamente sincronizados:

Código C:
Ver original
  1. char textoPlano[64];
  2. char cifrado[64][6];

Y, si no te convence ninguna de estas soluciones, siempre puedes optar por usar un árbol o una lista enlazada.

Soluciones tienes muchas, no te podrás quejar :)

Un saludo
  #3 (permalink)  
Antiguo 27/05/2015, 12:37
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: comparar cadenas de un archivo,imprime basura

hola bueno gracias pro ackararme lo del bin que lea hasta caracter nulo

Código &quot:
Ver original
  1. while (bin[i]!= ' '){
  2.             for (v=0;v<z;v++){
  3.                 array[v]=bin[v];
  4.                 conta++;
  5.             }
  6.             i++;
  7.     }

es que yo tomaba de esa cadena y tomaba cada 5 digitos despues que hacia todas esas cosas y comparara con el archivo reglas queria que ahora mi v= fuera hoara mi i y ahora que a z sumarle +5 para que asi ahora compare los otros 5 digitos digitos sigueintes que van del 5 al 9.

y sobre el fscanf como sugieres que lo cambie?
  #4 (permalink)  
Antiguo 27/05/2015, 12:40
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: comparar cadenas de un archivo,imprime basura

Cita:
Iniciado por jose_27 Ver Mensaje
hola bueno gracias por aclararme lo del bin que lea hasta caracter nulo

Código &quot:
Ver original
  1. while (bin[i]!= ' '){
  2.             for (v=0;v<z;v++){
  3.                 array[v]=bin[v];
  4.                 conta++;
  5.             }
  6.             i++;
  7.     }

es que yo tomaba de esa cadena y tomaba cada 5 digitos despues que hacia todas esas cosas y comparara con el archivo reglas queria que ahora mi v= fuera hoara mi i y ahora que a z sumarle +5 para que asi ahora compare los otros 5 digitos digitos sigueintes que van del 5 al 9.

y sobre el fscanf como sugieres que lo cambie?
  #5 (permalink)  
Antiguo 27/05/2015, 13:01
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: comparar cadenas de un archivo,imprime basura

Cita:
Iniciado por jose_27 Ver Mensaje
es que yo tomaba de esa cadena y tomaba cada 5 digitos despues que hacia todas esas cosas y comparara con el archivo reglas queria que ahora mi v= fuera hoara mi i y ahora que a z sumarle +5 para que asi ahora compare los otros 5 digitos digitos sigueintes que van del 5 al 9.
No estamos en un patio de colegio. Este es un foro serio y se exige un mínimo de seriedad. No hables como un niño de 5 años. Tienes tiempo de sobra para leer lo que has escrito y terminar de darle forma para que sea legible. No se trata de escupir palabras sin más.

Cita:
Iniciado por jose_27 Ver Mensaje
y sobre el fscanf como sugieres que lo cambie?
quita el '&' al puntero
  #6 (permalink)  
Antiguo 27/05/2015, 13:18
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: comparar cadenas de un archivo,imprime basura

Hola lo siento, siempre trato de ser lo mas especifico que puedo pero acabe de llegar a mi casa y queria escribir lo antes posible, gracias ya le que quite el & cierto que para cadenas no necesitas el &, lamento si sone como un niño(tengo 18), gracias por eso y seguire probando mi codigo gracias.

Cualquier otro inconveniente que se me presente te escribire gracias.
  #7 (permalink)  
Antiguo 27/05/2015, 14:28
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: comparar cadenas de un archivo,imprime basura

Cita:
Iniciado por jose_27 Ver Mensaje
Hola lo siento, siempre trato de ser lo mas especifico que puedo pero acabe de llegar a mi casa y queria escribir lo antes posible, gracias ya le que quite el & cierto que para cadenas no necesitas el &, lamento si sone como un niño(tengo 18), gracias por eso y seguire probando mi codigo gracias.

Cualquier otro inconveniente que se me presente te escribire gracias.
No es nada personal. Es simplemente que si no intentamos mantener un listón mínimo el foro se vuelve, sencillamente, infumable.

Etiquetas: cadenas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:57.