Je perds la tête avec cette erreur et je ne peux pas comprendre ce qui ne va pas. J'ai fait du débogage pour le faire fonctionner, mais cela ne va pas dans le bon sens. Pour une raison quelconque, le premier scanf() lit deux entrées, la sienne et l'entrée de la scanf() suivante. D'ailleurs j'utilise %[^\n]s, car de cette façon, il devrait lire des chaînes avec un espace. Comment puis-je tout réparer?

CODE:

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

#define MAX_LEN_CODE 6
#define MAX_LEN_STRING 20

typedef struct{
    char course_code[MAX_LEN_CODE];
    char name[MAX_LEN_STRING];
    char trainer[MAX_LEN_STRING];
    int partecipants_max;
    int partecipants_num;
}t_course;

void main(){
    t_course new_course;

    system("clear");
    printf("Insert the code\n");
    printf("> ");
    scanf("%s", new_course.course_code);
    printf("Insert the name of the course\n");
    printf("> ");
    scanf(" %[^\n]s", new_course.name);
    printf("Insert the trainer\n");
    printf("> ");
    scanf("%s", new_course.trainer);
    do{
        printf("Insert the maximum number of partecipants (10-100)\n");
        printf("> ");
        scanf("%d", &new_course.partecipants_max);

        if(new_course.partecipants_max < 10 || 
        new_course.partecipants_max > 100)
            printf("ERROR: The number must be between 10 and 100!\n\n");

    }while(new_course.partecipants_max < 10 || 
        new_course.partecipants_max > 100);

    new_course.partecipants_num = 0;

    printf("\nCODE: %s\nNAME: %s\nTRAINER: %s\nPARTECIPANTS: %d\n", 
        new_course.course_code, new_course.name, 
        new_course.trainer, new_course.partecipants_max);
}

SORTIE:

Insert the code
> aa3040
Insert the name of the course
> fitness and sport
Insert the trainer
> mario
Insert the maximum number of partecipants (10-100)
> 55

CODE: aa3040fitness and sport  // I CAN'T FIGURE OUT THIS STEP
NAME: fitness and sport
TRAINER: mario
PARTECIPANTS: 55
3
reuseman 16 janv. 2017 à 17:17

2 réponses

Meilleure réponse

Vous écrasez l'espace pour terminer le caractère nul :

Vous avez:

#define MAX_LEN_CODE 6

Et dans votre struct t_course:

char course_code[MAX_LEN_CODE];

Ainsi, le course_code peut stocker 5 caractères + 1 pour terminer le caractère nul, c'est-à-dire '\0' pour marquer la fin de la chaîne, mais vous écrasez l'espace pour terminer le caractère nul en fournissant 6 caractères:

aa3040

Essayez de fournir +1 longueur:

//changing MAX_LEN_CODE value:
#define MAX_LEN_CODE 7

//or instead of changing MAX_LEN_CODE
//change the size of course_code in your struct:
char course_code[MAX_LEN_CODE + 1];

Ou faites en sorte que scanf() n'accepte que 5 caractères pour éviter d'écraser le caractère nul de fin à la fin en fournissant un spécificateur de largeur :

scanf("%5s", new_course.course_code);

//NOTE: You still need to consume the characters left in stdin
int consume; 
while((consume = getchar()) != '\n' && consume != EOF);
4
Cherubim 16 janv. 2017 à 16:20

course_code est un tableau de six char s, ce qui suffit seulement pour stocker une chaîne terminée par NUL de cinq caractères (puisque le NUL occupe un char). Le code étant en fait composé de six caractères, le NUL sera stocké dans course_code+6, qui se trouve être le premier octet de name. Ainsi, lorsque vous lisez ensuite une chaîne dans name, le NUL est écrasé et vous finissez par concaténer les deux chaînes par inadvertance.

2
rici 16 janv. 2017 à 14:21