2017-09-30 1 views
0

J'écrivais un programme en c pour vignere cipher, quand dans une fonction pour générer la clé comme la même longueur de nom d'entrée, j'ai rencontré un bug où si je supprime la ligne "printf" affichant la longueur de la chaîne d'entrée, imprime des trucs bizarres sur le sceen, cela n'arrive que lorsque je supprime cette ligne "printf" de la fonction GenKey().C: Programme imprime des trucs bizarres dans la sortie, après avoir supprimé printf de la fonction char

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *GenKey(char *key, char *source){ 
    int i=0,j=0; 
    char ReturnKey[strlen(source)]; 

    printf("%d\n",strlen(source));  // THIS LINE HERE CAUSES PROBLEM 

    for(i=0;i<strlen(source)-1;i++){ 
     if(j==strlen(key)){ 
      j=0; 
     } 
     ReturnKey[i]=key[j]; 
     j++; 
     } 
     return ReturnKey; 
} 

int main() 
{ 
    int i; 
    char name[10000]; 
    char container[10000]; 
    char VigKey[]="INFERNO"; 
    char *NamePtr; 
    char *KeyPtr; 
    printf("give a name: "); 
    fgets(name,10000,stdin); 

    char GeneratedKey[strlen(name)]; 
    KeyPtr=VigKey; 
    NamePtr=name; 
    strcpy(GeneratedKey,GenKey(KeyPtr,NamePtr)); 
    printf("%s",GeneratedKey); 
} 

sortie (Avant de supprimer cette ligne):

give a name: ATTACKATDAWN 
13 
INFERNOINFER 

Maintenant, je supprimer cette ligne

char *GenKey(char *key, char *source){ 
    int i=0,j=0; 
    char ReturnKey[strlen(source)]; 

    // NOW I HAVE DELETED THAT LINE 

    for(i=0;i<strlen(source)-1;i++){ 
     if(j==strlen(key)){ 
      j=0; 
     } 
     ReturnKey[i]=key[j]; 
     j++; 
     } 
     return ReturnKey; 
} 

sortie (Après la suppression de cette ligne):

give a name: ATTACKATDAWN 
INFERNOINFERα╫` 
+0

vous retournez un pointeur vers la mémoire c'est déjà sorti. Après une fonction retournée, les variables locales automatiques n'existent plus. – zerkms

+0

Activer les avertissements du compilateur. –

Répondre

1

Essayez créer le tableau de caractères ReturnKey sur le tas avec malloc comme ceci:

char *GenKey(char *key, char *source){ 
    int i=0,j=0; 
    char *ReturnKey = malloc(sizeof(char) * strlen(source)); 
    for(i=0;i<strlen(source)-1;i++){ 
     if(j==strlen(key)){ 
      j=0; 
     } 
     ReturnKey[i]=key[j]; 
     j++; 
    } 
    return ReturnKey; 
} 

Avant, quand vous créez ReturnKey, vous le faites en tant que variable locale qui ne vit que dans le cadre de cette fonction. Même si vous voyiez votre mot toujours là, c'était juste parce qu'il était encore dans cette position en mémoire mais n'était plus référencé par un objet. Lorsque vous créez un tableau dynamique avec une fonction comme malloc, vous le créez sur ce que l'on appelle "heap" qui ne se libère pas quand il sort du cadre, de cette façon vous pouvez le renvoyer de la fonction (vous renvoyez un pointeur vers cet emplacement en mémoire). Lors de l'utilisation de malloc, notez que la mémoire n'est PAS LIBEREE. Vous devrez donc la libérer vous-même en appelant gratuitement, faute de quoi vous perdrez de la mémoire.

C'est ce que le code complet pourrait ressembler à:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *GenKey(char *key, char *source){ 
    int i=0, j=0; 

    // malloc takes the size of the data type * the length 
    char *ReturnKey = malloc(sizeof(char) * strlen(source)); 

    for(i=0;i<strlen(source)-1;i++){ 
     if(j==strlen(key)){ 
      j=0; 
     } 
     ReturnKey[i]=key[j]; 
     j++; 
    } 
    return ReturnKey; 
} 

int main() 
{ 
    int i; 
    char name[10000]; 
    char container[10000]; 
    char VigKey[]="INFERNO"; 
    char *NamePtr; 
    char *KeyPtr; 
    printf("give a name: "); 
    fgets(name,10000,stdin); 

    KeyPtr=VigKey; 
    NamePtr=name; 
    char *GeneratedKey = GenKey(KeyPtr,NamePtr); 
    printf("%s",GeneratedKey); 
    free(GeneratedKey); // IMPORTANT!!! 
} 

Voici un plus à l'article en profondeur sur l'utilisation de malloc et libre:

https://www.codingunit.com/c-tutorial-the-functions-malloc-and-free

+0

Cette réponse vous serait vraiment utile si elle vous expliquait ce qui ne va pas avec le code original et comment votre modification le corrige. Sans cela, ce conseil n'aide personne ici (et sera effectivement une fuite de mémoire dans l'application de l'OP). – zerkms

+0

@zerkms ya votre droit laissez-moi éditer – Asleepace

+0

............. – zerkms