CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Problème scanf

Patatophobe
Patatophobe
Niveau 10
11 octobre 2014 à 20:59:31

Salut, voilà je viens à peine de reprendre les cours de C qui reprennent tout à 0 et malgré tout j'ai déjà un problème avec une fonction tout ce qu'il y a de plus basique... :hap:

Je vous balance mon code et je m'explique :ok:

  1. include <stdio.h>
  2. include <stdlib.h>

int main()
{
int temperature;
char temps, voisin;

printf("Quel est le temps? [S]oleil, [P]luie, [C]ouvert\n");
scanf("%c", &temps);
printf("temps: %c\n", temps);

printf("Quelle est la temperature\n");
scanf("%d", &temperature);
printf("temperature: %d\n", temperature);

printf("Un voisin est-il present? [O]ui, [N]on\n");
scanf("%s", &voisin);
printf("voisin: %c\n", voisin);

if(((voisin=='n')||(voisin=='N'))&&(((temps=='s')|
|(temps=='S'))||(((temps=='c')||(temps=='C'))&&(te
mperature>=10))))

{
printf("Vous pouvez promener votre chien\n");
}

else
{
printf("Vous ne pouvez pas promener votre chien\n");
}
return 0;
}

Voilà en gros, l'utilisateur doit rentrer le temps qu'il fait, la température extérieur et si un voisin est présent puis en fonction des réponses, l'ordi dit si on peut sortir son chien ou non.

Le problème c'est que le 2ème scanf merde pour une raison inconnu car je sais les scanf c'est pas super surtout si on en a plusieurs il me semble mais on nous a jamais dit réellement pourquoi et comment contourner ce problème.

En effet, peut-être vous vous en doutez si vous vous y connaissez, mais les 2 premiers scanf marchent nickel e tle 3ème merde. Donc j'ai mis à la place du %c un %s car il me semble qu'un prof avait réglé le problème comme ça un jour sans vraiment m'expliquer mais malgré ça, ça bug. Si je rentre les bons paramètres en entrée, j'ai pas la bonne sortie...

Du coup j'ai testé en passant la variable voisin de float à int et en remplaçant le oui/non que doit rentrer l'utilisateur par 0/1 et là par contre ça marche.

Donc bon... Je sais pas si j'ai été clair mais si vous comprenez et que vous pouvez m'aider, merci :ok:

swarmpan
swarmpan
Niveau 9
11 octobre 2014 à 21:09:19

Essaie de remplacer scanf par getchar

godrik
godrik
Niveau 30
11 octobre 2014 à 22:09:44

"%s" c'est pour les chaines de caractere et pas juste un charactere. %c pour juste un charactere.

Korback
Korback
Niveau 10
11 octobre 2014 à 23:05:46

Je te conseil de prendre un seul scanf pour tout et tu réinisialise à chaque question.

Comme ça t'as qu'un seul scanf pour tout.

En prenant aussi en compte la remarque de godrik, ça devrait être nickel.

Patatophobe
Patatophobe
Niveau 10
11 octobre 2014 à 23:32:11

Swarmpan :d) J'avais essayé mais je sais pas trop comment ça fonctionne alors j'ai foiré. J'ai fait fait quelque chose comme:

voisin=getchar();

Après je m'y suis peut-être mal pris, je reverrais ça demain et je te dirais :ok:

godrik :d) Ouais je sais Enfin non pour le %s je sais pas exactement mais il me semblait que ça avait résolu un problème à un moment. En attendant avec un %s, si je mets des sprintf pour afficher ce qu'à taper l'utilisateur, je peux afficher le caractère voisin tandis qu'avec %c ça fonctionne pas, d'ailleurs on a même aps le temps de rentrer une touche que ça passe à l'étape suivante

Korback :d) Je suis pas sûr de comprendre. Tu voudras que je fasse une boucle dans laquelle je rentre 3 fois mais à chaque entrée, la question change ainsi que la variable dans laquelle va être stocké a valeur/caractère que rentre l'utilisateur?

Korback
Korback
Niveau 10
12 octobre 2014 à 13:24:05

Mince, je sais pas si ça fonctionne comme ça en C mais en C# tu peux réinisialiser une variable qui se nomme "CaractereEntree" que tu utilises pour tout tes scanf et tu la réinisialise à chaque utilisation.

[Kyomaro]
[Kyomaro]
Niveau 10
12 octobre 2014 à 14:43:09

Je débute aussi en C, mais c'est pas parce qu'il test sa variable avec des '' alors que c'est une chaîne de caractères ? Essaie avec "" pour voir :(

FortCommeMeric
FortCommeMeric
Niveau 10
12 octobre 2014 à 16:45:31

C'est parce qu'il scan un char avec %s et non %c comme l'a dit godrik c'est aussi simple que ça....

Et aussi il faut pas oublier que si tu fais :

scanf("%d", &entier);
scanf("%c", &char);

char va être égal à '\n' parce que pour valider la saisie de l'entier l'utilisateur va appuyer sur entrée.

Patatophobe
Patatophobe
Niveau 10
12 octobre 2014 à 17:28:50

Bon j'ai essayé les getchar mais ça merde aussi :ok:

Et non c'est pas à cause du %c que j'ai transformé en %s, au contraire ça arrange un poil, je vais vous montrer

:d) https://image.noelshack.com/fichiers/2014/41/1413127553-qsdfg.jpg

En gros le 1er je fais un truc basique avec un %c mais le programme nous laisse pas le temps de rentrer un caractère pour la variable voisin.

Lors du second screen, j'ai juste remplace le %c par un %s et le programme nous laisse le temps de rentrer un caractère et on l'affiche bel et bien

Et enfin 3ème cas, redéfini la variable voisin en la passant en int et cette fois ci on ne doit pas rentrer de caractère mais 0 ou 1 et là le programme fonctionne nickel

Y a pas une historie de buffer ou j'sais pas quoi? Il me semble avoir entendu ça un jour :(

FortCommeMeric
FortCommeMeric
Niveau 10
12 octobre 2014 à 17:47:44

Quand tu fais scanf("%d", &temperature);

L'utilisateur entre un nombre par exemple 26 et ensuite il tape entrée pour valider.

Le 26 va dans la variable température, et la touche entrée (caractère '\n') reste dans l'entrée standard.

Ensuite tu fais scanf("%c", &voisin); et ça tombe bien il y a déjà un caractère dans l'entrée standard (le '\n') donc le programme se sert et il met ce caractère dans la variable voisin (c'est pour ça que quand tu veux afficher voisin ça saute une ligne, le caractère '\n' saute une ligne si on l'affiche) et donc le programme ne laise pas le temps à l'utilisateur d'entrer quelque chose puisqu'il s'est déjà servi.

Tu peux faire comme ça par exemple :

scanf("%c%c", &retourChariot, &voisin);

Tu consome le '\n' et ensuite tu lis ta valeur.

Tu peux même essayer de faire comme ça mais je suis pas sûr à 100%

scanf("\n%c", &voisin);

:)

Patatophobe
Patatophobe
Niveau 10
12 octobre 2014 à 19:03:53

FortCommeMeric :d) Putain merci ça fonctionne :content:

Bon ben maintenant je saurais pourquoi il m'arrivait d'avoir des problèmes de scanf avec les caractères :ok:

Sinon je te confirme que cette ligne fonctionne :oui:

:d) scanf("\n%c", &voisin);

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment