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'
El * que pusiste en frente de 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..
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..
La verdad no se lo que intentas hacer con el archivo. XD
char buffer2[58] = "abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";
Da= :) si lo cambio me da este error:
cifrador.c:24: error: incompatible types when assigning to type 'char[58]' from type 'char *'
Pensa a los arrays como punteros...
vos queres hacer algo asi:
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/ (http://www.cplusplus.com/reference/clibrary/cstring/memcpy/)
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.
si no vas a modificar la cadena puedes hacer esto:
char* buffer2 = "abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";
y si lo piensas modificar haz esto antes del main:
char buffer2[] = "abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";
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 :(