Petit problème de C

Résolu/Fermé
LeProgrammeurdu93 Messages postés 18 Date d'inscription samedi 30 septembre 2017 Statut Membre Dernière intervention 17 octobre 2019 - Modifié le 2 oct. 2017 à 16:09
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 3 oct. 2017 à 09:38
Bonjour, je suis débutant en programmation en C. Je voudrais savoir :
Quand je lance mon programme il marche parfaitement, mais au premier scanf que j'ai, il demande 2 nombre en ne comptant que le premier. J'utilise Windows 7 et Code::Blocks.
Voici mon code
int sommeTableau(int tableau[], int tailleTableau);

int main(int argc, char *argv[])
{
    int valeur_1 = 0, valeur_2 = 0, valeur_3 = 0, valeur_4 = 0;
    printf("Entrez un nombre : \n");
  <underline>  scanf("%d\n", &valeur_1); // C'est sur ce scanf qu'il demande 2 fois un nombre</underline>
    printf("Entrez un deuxieme nombre : \n");
    scanf("%d\n", &valeur_2);
    printf("Entrez un troisieme nombre : \n");
    scanf("%d\n", &valeur_3);
    printf("Entrez un dernier nombre : \n");
    scanf("%d\n", &valeur_4);
    printf("La somme des nombres que vous avez ecrit est : ");
    int montab [4] = {valeur_1,valeur_2,valeur_3,valeur_4};

    return sommeTableau(montab, 4);
}
int sommeTableau(int tableau[], int tailleTableau)
{
        int i = 0, somme_totale = 0;
        somme_totale = tableau[i] + tableau[i+1] + tableau[i+2] + tableau[i+3];
        printf("%d\n", somme_totale) ;
        return  0;
}

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

2 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
30 sept. 2017 à 19:29
Bonjour,

Les "%d\n" qui sont dans les
scanf()
attendent un nombre entier (%d) puis une fin de ligne (\n), c'est l'attente de la fin de ligne en plus qui provoque un décalage. Il vaut mieux utiliser " %d" qui extrait un quelconque séparateur s'il est présent, puis lit un nombre.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
2 oct. 2017 à 13:20
Salut LeProgrammeurdu93,

Tu pourrais aussi améliorer ton code de plusieurs façons.

Par exemple, en déclarant le tableau montab au début de main(), et en l'utilisant pour stocker les valeurs. Cela évite de créer 4 variables additionnelles, et d'initialiser le contenu du tableau avec tes variables.

S'agissant de la fonction sommeTableau(), elle devrait utiliser tailleTableau et une boucle pour être vraiment utilisable sur d'autres tailles, comme le laisse penser son prototype. Par ailleurs, elle pourrait renvoyer la somme au lieu de 0, ce qui te permettra de l'appeler directement en argument du dernier printf du main, et de dissocier les fonctions d'affichage de celles de calcul.

Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
2 oct. 2017 à 15:51
comme scanf travaille sur le flux stdin, autant simplifier aussi le code et l'interface utilisateur en demandant à ce que les 4 entiers soient tapés séparés par des espaces, qui seront consommés par scanf.

cela permettra aussi de valider que l'utilisateur a bien saisi 4 entiers, et n'a pas tapé "toto" ou un nombre décimal, en contrôlant que la valeur de retour de scanf est bien 4, et s'assurant ainsi que l'on a des valeurs correctement initialisées avant de lancer le calcul :-)
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
3 oct. 2017 à 09:38
par exemple, ton main pourrait ressembler à cela :

int main(void) {
    int montab[4] = { 0 };

    printf("Tapez 4 entiers séparés par des espaces:\n");
    if (scanf("%d%d%d%d", &montab[0], &montab[1], &montab[2], 
                &montab[3]) == 4)
        printf("La somme de ces nombres est : %d\n", 
                sommeTableau(montab, 4));
    else
        printf("Erreur : vous n'avez pas tapé 4 entiers " 
                "séparés par des espaces.\n");

    return 0;
}
0