Transformation d'une chaine de carcatère en décimal

a marqué ce sujet comme résolu.

Bonjour, je souhaiterai transformer ma chaine de caractère en décimal avec quelques tests pour savoir si le caractère est une lettre par exemple. Le soucis est un problème de mémoire : "L’état de la mémoire de peut pas être read". Voici mon code :

#include<stdio.h>

// décalage de caractère
char plusLoin(char c, int n){
    return c+n;
}

// Test pour savoir si le caractère est une lettre de l'alphabet (minuscule et majuscule)
int estLettre(char c){
    if(((c>='a') && (c<='z')) || ((c>='A') && (c<='Z'))){
        return 1;
    }
    else{
        return 0;
    }
}

// S’il s’agit d’une lettre, elle l’enregistre dans un tableau de caractères, sinon elle enregistre un espace dans le tableau
char SaisirTableau(char * T, int n){
    char * TRes = malloc(n*sizeof(char));
    int i;
    char free;
    for(i=0;i<n;i++){
        free=getchar(); //vider le tampon après un scanf
        if(estLettre(T[i]) == 1){
            TRes[i] = T[i];
        }
        else{
            TRes[i] = ' ';
        }
    }
    return TRes;
}

// fonction de conversion d'un caractère en décimal
int * Conversion(char * T, int n){
    int *Tint = malloc(n*sizeof(int));
    int i=0;
    while(i<n){
        Tint[i] = T[i];
        i++;
    }
    return Tint;
}

// Utilisé pour main
void Codage2(char * T, int n){
    int i, distance;
    int * Tab_ASCII = malloc((n+1)*sizeof(int));
    Tab_ASCII = Conversion(SaisirTableau(T[i],n), n);
    
    printf("Donner la distance : ");
    scanf("%d", &distance);
    printf("Chaine apres le chiffrage : ");
    for(i = 0; i<n ;i++){
        printf("%d",plusLoin(Tab_ASCII[i], distance));
    }
    Tab_ASCII[i] = '\0';
}

int main () {
    int n=13;
    char chaine[] = "Mot!de#passe?"; //déclaration chaine de caractères
    printf("Chaine avant le chiffrage : %s\n", chaine); //affichage message + chaine (comme codage 1)
    Codage2(chaine, n); // appel de la fonction codage2 qui transforme le message en suite de chiffre correspondant à la table ascii
}

Merci d’avance pour vos réponses

Quand j’essaye de compiler ton code avec clang ou gcc, j’obtiens un certain nombre de warnings qui indiquent de potentiels problèmes de typage.

Par exemple, tu appelles SaisirTableau avec un char comme premier argument, mais la déclaration de la fonction demande un char* comme premier argument. De même, SaisirTableau déclare retourner un char, mais la variable que tu retournes dans la fonction est un char*.

Ah oui d’accord je vois. J’utilise le char* pour récupérer ma chaine qui se trouve dans le main. C’est parce-que j’ai pas envie de faire avec une saisie d’utilisateur.

Comment je devrais procéder dans ce cas la ? Peut-être mettre la fonction SaisirTableau en void pour qu’elle ne retourne rien ? Et pour l’appel de la fonction SaisirTableau dans la fonction Codage2, est-il possible de mettre en argument un *T[i] ?

Salut,

Tu as un soucis de fuite de mémoire ici.

int * Tab_ASCII = malloc((n+1)*sizeof(int));
Tab_ASCII = Conversion(SaisirTableau(T[i],n), n);

La première valeur de Tab_ASCII est perdue lors de la seconde affectation. D’ailleurs pourquoi le premier malloc() si la fonction Conversion() le fait pour toi ? Idem au sein de la fonction SaisirTableau(), tu fais un malloc(), que tu passes à la fonction Conversion(), mais il n’est jamais libéré (par un appel à free()).

Sinon, dans la fonction SasirTableau(), pourquoi faire appel à getchar() lors du parcours de ta chaîne ?

free=getchar();

Enfin, pour revenir sur ce que te disais @Berdes.

Tab_ASCII = Conversion(SaisirTableau(T[i],n), n);

C’est T que tu dois passer à SaisirTableau() et non T[i] et c’est un char * que la fonction doit retourner. ;)

+0 -0

Je pensais qu’il fallait ré-allouer de la mémoire à chaque fonction. Mais c’est vrai que quand j’appelle les fonctions je peux n’avoir qu’une seule allocation comme tu dis.Je les ai donc enlevés sauf celle de conversion.

Sinon, j’avais mis getchar() pour vider la mémoire après un scanf() que j’ai du enlever et j’ai du oublier d’enlever cette ligne par la même occasion.

J’ai également corrigé le point avec T et T[i].

Je te remercie pour ces précisions. Le programme continue cependant de mettre la même erreur

Bien sûr

#include<stdio.h>

// décalage de caractère
char plusLoin(char c, int n){
    return c+n;
}

// Test pour savoir si le caractère est une lettre de l'alphabet (minuscule et majuscule)
int estLettre(char c){
    if(((c>='a') && (c<='z')) || ((c>='A') && (c<='Z'))){
        return 1;
    }
    else{
        return 0;
    }
}

// S’il s’agit d’une lettre, elle l’enregistre dans un tableau de caractères, sinon elle enregistre un espace dans le tableau
char SaisirTableau(char * T, int n){
    char * TRes;
    int i;
    char free;
    for(i=0;i<n;i++){
        //free=getchar(); vider le tampon après un scanf
        if(estLettre(T[i]) == 1){
            TRes[i] = T[i];
        }
        else{
            TRes[i] = ' ';
        }
    }
    return TRes;
}

// fonction de conversion d'un caractère en décimal
int * Conversion(char * T, int n){
    int *Tint = malloc(n*sizeof(int));
    int i=0;
    while(i<n){
        Tint[i] = T[i];
        i++;
    }
    return Tint;
}

// Utilisé pour main
void Codage2(char * T, int n){
    int * Tab_ASCII;
    Tab_ASCII = Conversion(SaisirTableau(T,n), n);
    
    int i, distance;
    printf("Donner la distance : ");
    scanf("%d", &distance);
    printf("Chaine apres le chiffrage : ");
    for(i = 0; i<n ;i++){
        printf("%d",plusLoin(Tab_ASCII[i], distance));
    }
    Tab_ASCII[i] = '\0';
}

int main () {
    int n=13;
    char chaine[] = "Mot!de#passe?"; //déclaration chaine de caractères
    printf("Chaine avant le chiffrage : %s\n", chaine); //affichage message + chaine (comme codage 1)
    Codage2(chaine, n); // appel de la fonction codage2 qui transforme le message en suite de chiffre correspondant à la table ascii
}
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte