[C]Problème avec scanf dans une fonction

marsien

Grand Maître
Bonjour,

Merci par avance pour votre indulgence, je débute en langage C. J'essaie déjà de comprendre les rudiments créant de petits de code exécuté en mode console.

Et là, je me trouve face à un problème qui me laisse perplexe...

Déjà, la fonction où se trouve le problème :
Code:
void choixMarge()
{
    long marge = 0;
    long *pointMarge = &marge;
    char confirmMarge = 'n';
    char *pointConfirmMarge = &confirmMarge;

    do
    {
        printf("Votre marge actuelle est de 20 pourcent ; nouvelle marge ? ");
        scanf("%ld", pointMarge);
        printf("Votre nouvelle marge est de %ld pourcent.\nConserver cette valeur ? (o/n)", *pointMarge);
        scanf("%c", pointConfirmMarge);
        printf("\n");
    }
    while(*pointConfirmMarge = 'n');
}

Cette fonction me sert à récupérer une valeur taper par l'utilisateur. Et je voudrais avoir confirmation que cette valeur est bien celle qu'il voulait. Mais à l'exécution, le programme "saute" mon dernier scanf, celui sensé récupérer un caractère (o ou n)... Voyez-vous l'origine du bug dans mon code ?

Merci d'avance
 

batchy

Grand Maître
je la vois à 500 Km.

%c dans un scanf récupère un caractère du flux d'entrée, mais UN SEUL caractère. et sans l'interpreter.

or dans un flux il y a des retours charriots, des espaces et bien d'autres choses. j'imagine que le dernier scanf lit en fait le retour charriot que l'utilisateur à tapé lorsqu'il était au premier scanf.

de manière générale, scanf("%c",&truc) ou son équivalent truc=getchar() ne font pas ce que l'on veut lorsqu'on fait une interface.

solution réellement sale :
Code:
while (getchar()!='\n');

pointConfirmMarge=getchar();

while (getchar()!='\n');
 

zeb

Modérateur
Fuir comme la peste la fonction scanf. Elle est puissante mais susceptible et snobe les newbies. Tu y reviendras peut-être ;)

Eh, Batchy, fgets, c'est de la balle :o
 

batchy

Grand Maître
non c'est trop naze, tu peut pas faire de la completion ou du rappel de commande avec :o
 

Emmanuel Delahaye

Expert

Pour commencer, fgets() est suffisant et standard. getline(), c'est bien, mais c'est pas portable...
 

marsien

Grand Maître
Merci à tous pour votre aide, en effet, ça marche bien avec fgets.

Une petite question subsidiaire (qui méritera peut-être un topic...) : j'aime bien la console (surtout celle de Windows :love:), mais je voudrais bien passer à quelque chose de plus abouti niveau interface. Mais je ne sais quelle librairie choisir : wxWidgets ? QT ? GTK+ ? J'aimerais bien une librairie multiplateforme et assez simple à utiliser. Laquelle me conseillez-vous ?

merci :)
 

Emmanuel Delahaye

Expert

C : GTK+
C++ : QT ou WxWidget
 

Emmanuel Delahaye

Expert

Tout ce qu'il faut ici :

http://www.gtk.org/


Have fun.
 

marsien

Grand Maître
Thanks a lot :)

Je reviendrais sûrement encore vous embêtez, vu mon petit niveau :D
 

KangOl

Grand Maître

sachant que la licence QT est assez cher pour du non GPL...
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 067
Membres
1 586 286
Dernier membre
petitangebleu1977
Partager cette page
Haut