IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Saisir et afficher un tableau de caractère


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 13
    Par défaut Saisir et afficher un tableau de caractère
    Bonjour à tous,

    Je veux créer un tableau de caractère pour créer un mot.
    Je veux rentrer caractère par caractère le mot puis l'afficher, voici mon code...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #include<stdio.h>
    #include<stdlib.h>
     
    void new(char* tab, int taille){
    	tab=(char*)malloc((taille+1)*sizeof(char));
    }
    void affiche(char* tab, int taille){
    	int i;
    	for(i=0;i<taille;i++){
    		printf("-%c-",tab[i]);
    	}
    	printf("\n");
    }
     
     
    int main(){
    	int n;
    	char* mot;
    	printf("Nombre de caracteres du mot ? ");
    	scanf("%d",&n);
            new(*mot,n);
    	printf("\nRentrer un a un les caracteres du mot \n");
    	int i;
    	for(i=0;i<n;i++){
    		scanf("%c\n",&(*(mot+i)));
    	}
    	affiche(mot,n);
    }

    Ca ne marche pas, pour un mot de 3lettres ou je saisis a puis b puis c, il devrait m'afficher -a--b--c-, mais en fait dans mot[0] il y a un saut de ligne, dans mot[1] il y a 'b', dans mot[2] il y a 'c', et rien dans mot[3]
    Je ne comprends pas pourquoi, quelqu'un peut-il m'éclairer ? Merci


    Nombre de caracteres du mot ? 3

    Rentrer un a un les caracteres du mot
    a
    z
    e
    -
    --a--z-

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Par défaut
    Le en plein milieu du main() n'est pas bon

    et je pense que y'a un problème avec ton tube vers le new(), quand tu envoie un int, tu travaille sur son adresse je crois ou un truc du genre : /

  3. #3
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Aïe aïe aïe !

    Déjà, ta fonction new doit être comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void new(char** tab, int taille){
    	*tab=(char*)malloc((taille+1)*sizeof(char));
    }
    Si tu veux avoir une chance de récupérer le tableau alloué.
    Du coup, l'appel doit être comme ça :
    (la version du code telle qu'elle est là (new(*mot,n)) ne devrait pas compiler ou au moins générer des warnings sevères !)

    Ton problème vient de ce que le retour le retour charriot de la saisie du nombre de char est resté dans le buffer de stdin et qu'il est directement consommé par le premier scanf de mot[0].
    Il faut faire un scanf dans un buffer de char puis un sscanf dans ce buffer.
    Ca donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    int main(){
        int  n,i;
        char *mot,str[10] ;
        printf("Nombre de caracteres du mot ? ");
        scanf("%s",str);
        sscanf(str,"%d",&n);
        new(&mot,n);
        printf("\nRentrer un a un les caracteres du mot \n");
        for(i=0;i<n;i++){
            scanf("%s",str);
            sscanf(str,"%c",&(*(mot+i)));
        }
        affiche(mot,n);
        return( 0 ) ;
    }
    Pour bien faire, il faudrait tester le retour du sscanf. S'il ne vaut pas 1, c'est que l'utilisateur a saisi un nombre incorrecte. Pour l'instant, c'est la cata : si la saisie est incorrecte, n n'est pas initialisé et c'est le début de la fin...

    Et puis, juste pour être plus lisible, ton sscanf devrait ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(str,"%c",&mot[i]);
    Et enfin, pour être plus sécure, il faudrait saisir les chaînes avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets( str,10,stdin ) ;
    bon courage !

    Hadrien

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur mobile iOS / Android
    Inscrit en
    Décembre 2008
    Messages
    259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur mobile iOS / Android
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 259
    Par défaut
    Salut

    Tu es entrain de faire de l' allocation dynamique, donc tes variables seront allouées en mémoire dans une zone appelée le tas. ces variables doivent être détruites à la fin de ton programme.C' est au programmeur (toi) de le faire de manière explicite.

    Étant donnée que tu as utilisé la fonction malloc, il faut que tu désalloues la mémoire allouée grâce à la fonction free. tu placeras cette fonction à la fin de ton int main() comme ceci: free(tab);

    IMPORTANT:
    Ta variable mot est un tableau de chaine de caractères, ici tu n'as pas besoin d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(i=0;i<n;i++){
    		scanf("%c\n",&(*(mot+i)));
    	}
    mais plustôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(i=0;i<n;i++){
    		scanf("%c\n",&mot[i]);
    	}

    Essaie et n'hésite pas à nous resolliciter
    « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell

    N'oubliez pas de consulter les FAQ Swift, Android
    Tutoriel : Développer une application multilingue sous iOS

  5. #5
    Membre chevronné

    Homme Profil pro
    Développeur mobile iOS / Android
    Inscrit en
    Décembre 2008
    Messages
    259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur mobile iOS / Android
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 259
    Par défaut
    sopsag

    le paramétre char** tab est-ce nécessaire ici ? je pense que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void new(char* tab, int taille){
    	tab=(char*)malloc((taille+1)*sizeof(char));
    }
    suffirait. char** tab c'est un tableau de caractères à deux dimensions.
    « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell

    N'oubliez pas de consulter les FAQ Swift, Android
    Tutoriel : Développer une application multilingue sous iOS

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    La second étoile est nécessaire car que la fonction new() doit modifier la variable.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par arnodujura Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void new(char* tab, int taille){
    	tab=(char*)malloc((taille+1)*sizeof(char));
    }
    Ce code ne peut pas fonctionner :

    http://emmanuel-delahaye.developpez....ge=Page3#LXIII

    Citation Envoyé par Seelass Voir le message
    sopsag

    le paramétre char** tab est-ce nécessaire ici ? je pense que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void new(char* tab, int taille){
    	tab=(char*)malloc((taille+1)*sizeof(char));
    }
    suffirait. char** tab c'est un tableau de caractères à deux dimensions.
    Tu racontes n'importe quoi...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 13
    Par défaut merci
    J'ai modifier ma fonction new pour bien récupérer mon tableau et j'ai utilisé le sscanf qui resoud ce problème de buffer, j'aurais pas trouver tous seul je débute encore en c.
    Alors merci à tous !!!!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/02/2014, 12h51
  2. saisir la taille d'un tableau de caractère
    Par nesrine6215 dans le forum Débuter
    Réponses: 6
    Dernier message: 12/05/2008, 20h03
  3. Réponses: 3
    Dernier message: 20/02/2008, 22h36
  4. Réponses: 2
    Dernier message: 03/03/2005, 14h57
  5. AFFICHER UN TABLEAU DYNAMIQUE
    Par ghassenus dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2002, 14h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo