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 :

Erreur d’exécution de while


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2015
    Messages
    405
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2015
    Messages : 405
    Par défaut Erreur d’exécution de while
    Bonjour tout le monde;
    Je suis entrain de tester la solution d'un exercice en C avec l'éditeur Code:Blocks; mais après la compilation de l'exercice ça saute sur des ligne dans l’exécution;
    J'ai essaye avec mon ancien projet aussi ça n'a rien changé;

    je voudrais votre aide pour débloquer cette erreur

    Merci d'avance;

    Premier exo avec While : dans while ça affiche deux fois
    un autre:
    un autre:
    avant la lecture du caractère

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include<stdio.h>
    #define t 50
    int main(void){
    int i,j,n,nb;
    char tab[t], voyelle[]={'a','e','i','j','u','y'};
    i=0;
    n=0;
    nb=0;
    printf("un caractère:");
    printf("\n");
    scanf("%c",&tab[i]);
     
    while(tab[i]!=' ' ){
    ++i;
    printf("un autre:");
    printf("\n");
    scanf("%c",&tab[i]);
    }
    n=i;
    for(i=0;i<n;i++){
    printf("tab[%d]=%c \n",i,tab[i]);
    }
    for(i=0;i<n;i++){
    printf("%c ",tab[i]);
    }
    for(j=0;j<6;j++){
    for(i=0;i<n;i++){
    if(tab[i]==voyelle[j])
        nb++;
    }
    printf("Vous avez %d fois voyelle(s) %c ",nb,voyelle[j]);
    printf("\n");
    nb=0;
    }
     
    return 0;
     
    }
    le projet avec la partie Saisie:ça saute toujours deux lignes
    donner le nom
    donner le prenom
    avant de lire ou le scanf()
    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
    void Saisie(struct Etudiant E1[], int *n){
    int i=0;
    printf("donner un numero:");
    printf("\n");
    scanf("%d",&E1[i].num);
    while(E1[i].num!=-1){
        printf("donner le nom");
        printf("\n");
        scanf("%c",&E1[i].nom);
        printf("\n");
        printf("donner le prenom");
        printf("\n");
        scanf("%c",&E1[i].prenom);
        printf("\n");
        printf("donner un numero:");
        printf("\n");
        scanf("%d",&E1[i].num);
        i++;
    }
    *n=i;
    }

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Bonjour

    C'est un souci récurrent dans l'apprentissage du C pour un débutant. Les profs, pour se simplifier la vie, introduisent assez vite la notion de "scanf()". Or "scanf" (Scan Formaté) attend une entrée "formatée" et ce qu'on tape au clavier est tout sauf formaté.

    Quand tu saisis ta lettre via scanf("%c", &tab[i]), tu tapes ta lettre et tu valides par l'appui sur la touche <return>. Ben la lettre est correctement capturée par le scanf() mais cette touche <return> reste dans le tampon clavier. Et à la boucle suivante, le scanf() suivant lit ce <return> (qui est lui-aussi un caractère) et le récupère sans attendre que tu tapes une touche. Ce qui te donne l'illusion que le scanf() n'a rien fait. pourtant le tableau a bel et bien été rempli. Tu le verras si tu remplaces printf("tab[%d]=%c \n",i,tab[i]) par printf("tab[%d]=%c (%d)\n", i, tab[i], tab[i]) tu verras que tab[i] contient bel et bien des valeurs (valeur 10 représentant le caractère <return>).

    Solution palliative (avant que tu aies les connaissances adéquates pour pouvoir créer des saisies plus robustes): rajouter un fgetc(stdin) juste après le scanf() pour supprimer ce <return>. A faire chque fois que tu fais saisir un char, un int ou un float (dans ce cas le <return> n'est pas récupéré et reste dans le clavier). Pour les strings ce n'est pas nécessaire (puisque le <return> faisant partie de la string, dans ce cas, est correctement récupéré et disparait alors du clavier).

    Accessoirement, pour l'exo sur les étudiants, je ne suis pas certain que l'instruction scanf("%c",&E1[i].nom) soit des plus adéquates (ou alors le nom c'est juste "un caractère"?). Faut éviter de copier/coller des instructions sans réfléchir un petit peu au préalable. Et pareil quand tu définis les voyelles comme contenant la lettre 'j'... Et ce n'est pas interdit d'indenter et aérer ton code, cela ne compilera pas moins vite et le rendra plus lisible.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2015
    Messages
    405
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2015
    Messages : 405
    Par défaut
    Merci le premier est réglé;
    le deuxième ne sort pas de la boucle quand je tape -1

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
     
    #include<stdio.h>
    #define t 50
     
    struct Etudiant{
           int num;
           char nom[30];
           char prenom[50];
    } E1[t];
     
    void Saisie(struct Etudiant E1[], int *n){
     
    int i=0;
     
    printf("donner un numero:\n");
    scanf("%d",&E1[i].num);
    fgetc(stdin);
     
    while(E1[i].num!=-1){
     
        printf("donner le nom\n");
        scanf("%s",&E1[i].nom);
        printf("\n");
     
        printf("donner le prenom\n");
        scanf("%s",&E1[i].prenom);
        printf("\n");
     
        printf("donner un numero:\n");
        scanf("%d",&E1[i].num);
        fgetc(stdin);
        printf("\n");
     
         i++;
                               }
     
    *n=i;
     
    }

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sandaff Voir le message
    le deuxième ne sort pas de la boucle quand je tape -1
    Concentre-toi sur la valeur de "i". Demande-toi ce qui se passe quand tu fais saisir E1[i].num et que tu évalues E1[i].num au tour suivant.

    Et scanf("%s",&E1[i].nom) c'est un petit peu mieux que tout à l'heure... mais pas encore parfait...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2015
    Messages
    405
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2015
    Messages : 405
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Concentre-toi sur la valeur de "i". Demande-toi ce qui se passe quand tu fais saisir E1[i].num et que tu évalues E1[i].num au tour suivant.

    Et scanf("%s",&E1[i].nom) c'est un petit peu mieux que tout à l'heure... mais pas encore parfait...
    Un affichage en fin de boucle while me montre que E1[i].num=-1 donc la valeur est correcte; le problème reste le même;

    scanf("%s",&E1[i].nom) qu'est ce qui est plus parfait à ce niveau?

    Merci pour votre précieux temps pour moi

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sandaff Voir le message
    Un affichage en fin de boucle while me montre que E1[i].num=-1 donc la valeur est correcte
    Est-ce que cet affichage (un printf je pense) est vraiment vraiment vraiment la toute toute toute dernière instruction de cette boucle??? Tu n'as pas mis le code mais franchement cela m'étonnerait. Et quand je dis que l'indentation est importante pour la lisibilité, c'est qu'elle est importante pour la lisibilité (pouvoir lire rapidement ce qui se passe à quel moment)

    Citation Envoyé par sandaff Voir le message
    scanf("%s",&E1[i].nom) qu'est ce qui est plus parfait à ce niveau?
    Pas de "&" pour les chaines, leur nom correspond déjà à une adresse...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sandaff Voir le message
    Un affichage en fin de boucle while me montre que E1[i].num=-1
    Ben voilà. La preuve est faite que cet affichage, en ligne 31, ne se trouve pas en fin de boucle (qui est ligne 36). Ok il est "vers la fin", ok il est "proche de la fin", mais il ne se trouve pas "à la fin" (il y a 5 lignes entre la ligne 31 et la ligne 36 et 5 ce n'est pas "la fin").
    Surtout quand je te dis "concentre-toi sur la valeur de i", il semble donc évident que les instructions qui touchent à cette valeur auront une importance...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/02/2023, 15h54
  2. erreur File ended while scaning use of \@writefile
    Par Joshn dans le forum Erreurs - Avertissements
    Réponses: 4
    Dernier message: 14/08/2008, 18h08
  3. Réponses: 2
    Dernier message: 07/05/2008, 13h31
  4. [procédure stockée] Erreur dans un while
    Par LE NEINDRE dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 19/06/2007, 16h46
  5. Erreur dans le while
    Par Didier77 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 21/07/2006, 10h20

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