Cifrador root 13

Iniciado por Søra, 15 Diciembre 2010, 16:16 PM

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

Søra

Ola a todos he intentado hacer un codigo que cifre un archivo en root 13 y el gcc me da error solo 1 no e logrado solucionar.

#include <stdio.h>
#define root 13
main() {
printf("¿Número de carácteres?\n");
int num;
scanf("%i",&num);
char vector[num];
int c;
FILE *comprob;
comprob = fopen("archivo.txt","rb");
if (comprob==NULL) {
printf("No existe el archivo\n"); }
else {
int i;
for (i=0; i<num; i++) {
          c = fgetc(comprob);
          vector[i]=c;}

vector[i] = '\0';
fclose(comprob);
int a,b;

char z,buffer2[58],buffer3[10000];
buffer2 = *"abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";
for (a=0; a<num; a++) {
        for (b=0; b<58; b++) {
            if (vector[a]==buffer2[b]) {
                    z = a + root;
                    buffer3[a] = buffer2[z]; }}}}
             return 0;}


el error del gcc es:

codesC# gcc cifrador.c
cifrador.c: In function 'main':
cifrador.c:24: error: incompatible types when assigning to type 'char[58]' from type 'char'






Se busca sabio para intercambio:
Todo lo que se por la mitad de lo que desconozco.

pucheto

El * que pusiste en frente de
Código (c++) [Seleccionar]
buffer2 = *"abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+"; es el problema.

De todas formas tu error es quererle asignar a un array otro puntero... lo q tenes q hacer es un memcpy..

Søra

Acabo de leer como va el funcionamiento del memcpy sirve para copiar los primeros terminos de un objeto a otro pero no se como aplicarlo ya que yo no copio los n primeros terminos solo 1 no?? donde deberia ponerlo..





Se busca sabio para intercambio:
Todo lo que se por la mitad de lo que desconozco.

Shell Root

La verdad no se lo que intentas hacer con el archivo. XD
char buffer2[58] = "abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

Søra

Da= :) si lo cambio me da este error:

cifrador.c:24: error: incompatible types when assigning to type 'char[58]' from type 'char *'





Se busca sabio para intercambio:
Todo lo que se por la mitad de lo que desconozco.

pucheto

#5
Pensa a los arrays como punteros...

vos queres hacer algo asi:
Código (c++) [Seleccionar]

char buf[58]; //reservo un array del tamaño q quiero.
memcpy(buf,"abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+",58); //aclaro una cosa, el string ese q vos pones tiene tamaño 59, ya que como es un string, tiene un '/0' al final, pero copio solo lo q me interesa q es hasta el 58.


No probé compilar pero debería andar.

Un poco sobre memcpy... hay un ejemplo bastante claro al final...
http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

Código (c++) [Seleccionar]

for (i=0; i<num; i++) {
         c = fgetc(comprob);
         vector[i]=c;
}
vector[i] = '\0'; //Aca el seg fault

Estoy casi seguro q da segmentation fault.
Pq al salir del ciclo i es igual a num, entonces te pasas en 1 el tamaño del arreglo, pero creo, no me puse a analizar bien.

Arkangel_0x7C5

si no vas a modificar la cadena puedes hacer esto:
Código (cpp) [Seleccionar]

char* buffer2 = "abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";

y si lo piensas modificar haz esto antes del main:
Código (cpp) [Seleccionar]

char buffer2[] = "abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";

Søra

#7
Vale jeje creo que a sido una giñada de codigo :) el objetivo era cifrar un archivo de texto con root 13 pero algo deve fallar, he quitado la "b" a la hora de abrir archivos para que no los abra en modo binario pero aun asi cuando cifra el archivo da un tipo de archivo no reconocido y al descifrarlo pasa =, dejo el codigo.

CIFRADOR
#include <stdio.h>
#define root 13
main() {
char z,buffer3[10000];
printf("¿Número de carácteres?\n");
int num;
scanf("%i",&num);
char vector[num];
int c;
FILE *comprob;
comprob = fopen("archivo.txt","r");
if (comprob==NULL) {
printf("No existe el archivo\n"); }
else {
int i;
for (i=0; i<num; i++) {
          c = fgetc(comprob);
          vector[i]=c;}

vector[i] = '\0';
fclose(comprob);
int a,b;


char* buffer2 = "abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";
for (a=0; a<num; a++) {
        for (b=0; b<58; b++) {
            if (vector[a]==buffer2[b]) {
                    z = a + root;
                    buffer3[a] = buffer2[z]; }}}}
FILE *comprobfin;
comprobfin = fopen ("cifrado.txt","w+");

int d;
for (d=0; d<num; d++) {
fputc (buffer3[d],comprobfin); }
             return 0;}


DESCIFRADOR
#include <stdio.h>
#define root 13
main() {
char z,buffer3[10000];
printf("¿Número de carácteres?\n");
int num;
scanf("%i",&num);
char vector[num];
int c;
FILE *comprob;
comprob = fopen("cifrado.txt","r");
if (comprob==NULL) {
printf("No existe el archivo\n"); }
else {
int i;
for (i=0; i<num; i++) {
          c = fgetc(comprob);
          vector[i]=c;}

vector[i] = '\0';
fclose(comprob);
int a,b;


char* buffer2 = "abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";
for (a=0; a<num; a++) {
        for (b=0; b<58; b++) {
            if (vector[a]==buffer2[b]) {
                    z = a - root;
                    buffer3[a] = buffer2[z]; }}}}
FILE *comprobfin;
comprobfin = fopen ("archivo.txt","w+");

int d;
for (d=0; d<num; d++) {
fputc (buffer3[d],comprobfin); }
             return 0;}


a ver si me ayudan :(





Se busca sabio para intercambio:
Todo lo que se por la mitad de lo que desconozco.