2013-01-10 5 views
0

J'ai un problème que je ne peux vraiment pas comprendre. Je suis un programmeur débutant C, et j'ai un programme qui va à peu près comme ceci:Tableaux de pointeurs sur des chaînes - C

void filetostr(FILE *, char *s[]); 
void strtofile(char *s[], FILE *); 
void XORstr(char *, int); 
void XORtext(char *s[], int); 
void printext(char *s[]); 

int main(int args, char *argv[]) { 

    char *s[MAXLENGTH]; 
    char ln[MAXLENGTH]; 

    FILE *input, *xorred, *rexorred, *out; 

    input = fopen("input.txt", "r"); 
    filetostr(input, s); 
    fclose(input); 

    printext(s); 

    XORtext(s, KEY);   
} 

void filetostr(FILE *fp, char *s[]) { 
    char ln[MAXLENGTH]; 
    char *p; 
    int i = 0; 

    while (fgets(ln, MAXLINE, fp)) { 
     p = (char *) malloc(strlen(ln) * sizeof(char)); 
     strcpy(p, ln); 
     s[i++] = p; 
    } 
} 

void printext(char *s[]) { 
    while (*s) { 
     printf("%s", *s); 
     s++; 
    } 
} 

void XORstr(char *s, int key) { 
    int c; 
    while (c = *s) 
     *s++ = key^c; 
} 

void XORtext(char *txt[], int key) { 
    while (*txt) { 
     XORstr(*txt, key); 
     txt++; 
    } 
} 

et j'ai deux deux problèmes:

  • d'abord, quand je construis le tableau des pointeurs sur des chaînes avec filetostr, je l'ai fait fonctionner mais deux lignes au milieu du texte sont répétées (il y a deux références dans le tableau, ainsi avec printext elles sont imprimées deux fois). Comment est-ce possible? Y at-il un mauvais appel à malloc? Deuxièmement, quand j'essaye de XOR les lignes que je viens de mentionner, ils ne reçoivent XORred qu'une seule fois, donc je me retrouve avec une ligne XORred et une ligne normale pour chaque ligne dupliquée.
+0

En outre, ne pas oublier de vérifier 1) retour -value de la fonction 'malloc()'. 'if (p == NULL) {/ * pas de mémoire */exit (1); } 'et 2) s'il y a assez d'espace pour stocker' p' dans le tableau 's'; avant de 's [i ++] = p;': 'if (i> = MAXLENGTH) {/ * pas d'espace pour contenir p dans s * /}' Il peut planter votre application. – Jack

Répondre

3
p = (char *) malloc((strlen(ln) + 1) * sizeof(char)); 

au lieu de

p = (char *) malloc(strlen(ln) * sizeof(char)); 

BTW, vous pouvez changer

p = (char *) malloc((strlen(ln)+1) * sizeof(char)); 
strcpy(p, ln); 
s[i++] = p; 

par

s[i++] = strdup(ln) 

C'est la même

+2

Mais n'est-ce pas 'strdup()' POSIX? – Jack

+0

Comment est-ce que je me déplace le long du tableau? Auparavant je l'ai fait avec 'i ++' ... Peut-être que je dois ajouter 's [i ++] = p;' après la fonction 'strdup'? – whatyouhide

+0

désolé je fais une erreur dans ma réponse, il devrait être 's [i ++] = strdup (ln)'. Je vais mettre à jour la réponse – MOHAMED

1

Le malloc dans filetostr n'est pas tout à fait exact. Il devrait être

p = malloc(strlen(ln) + 1); 

Vous devez allouer de l'espace pour le caractère nul final, ne pas besoin de jeter le retour et peut compter sur sizeof(char) étant 1