¿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:
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 originalwhile (bin[i]!= ' '){
for (v=0;v<z;v++){
array[v]=bin[v];
conta++;
}
i++; //Agregué esto
}
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:
- i=0
- bin[i]=='A', luego bin[i]!=' '
- array[0] = bin[0], bin[0]=='A'
- conta++, conta==1
- array[1] = bin[1], bin[1]=='B'
- conta++, conta==2
- array[2] = bin[2], bin[2]=='\0'
- conta++, conta==3
- array[3] = bin[3], bin[3]==???
- conta++, conta==4
- array[4] = bin[4], bin[4]==???
- conta++, conta==5
- i++, i==1
- bin[i]=='B', luego bin[i]!=' '
- Se ejecutan los pasos 3 a 12
- i++, i==2
- bin[i]=='\0', luego bin[i]!=' '
- Se ejecutan los pasos 3 a 12
- i++, i==3
- bin[i]==???, luego bin[i]!=' ' (lo más probable) o bin[i]==' ' (más improbable)
- Se ejecutan los pasos 3 a 12
- ...
Como puedes comprobar, ese código no funciona correctamente.
Además, tu código tiene algunos problemas más:
"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)
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.
¿Para qué usas "word"? absolutamente para nada, después de esa asignación no vuelves a hacer nada con esa variable
"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 originalstruct clave
{
char textoPlano;
char cifrado[6]; // Nota que, para almacenar 5 caracteres, necesito un arreglo de tamaño 6
};
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 originalchar textoPlano[64];
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