2010-08-30 3 views
2

Je travaille sur une application simple écrite en C. Je travaille dans un environnement Unix.C - printf et scanf - Comment terminer une entrée?

Mon application effectue des E/S simples. J'utilise printf pour demander à l'utilisateur une entrée, puis j'utilise scanf pour obtenir cette entrée. Le problème est, je ne sais pas comment dire à mon application que je suis prêt à continuer après avoir entré une valeur. Taper 'enter' fournit une nouvelle ligne '\ n' qui a du sens. Control-d permet à scanf de capturer mon entrée mais semble ignorer toutes les instructions de scanf suivantes.

Quelqu'un peut-il m'aider?

printf("Enter name\n"); 
scanf("%s",input); 
printf("%s",input); 

printf("enter more junk\n") 
scanf("%s",morestuff); /* cntrl+d skips this*/ 
+0

Entrez ajoute non seulement un '\ n', mais aussi le tampon débusque. IO s'assied en attendant que le tampon soit plein ou qu'il soit rincé manuellement. –

Répondre

4

Vérifiez la valeur de retour à partir de scanf(). Une fois qu'il a obtenu EOF (en raison de vous tapez contrôle-D), il échouera chaque fois jusqu'à ce que vous effacez l'erreur.

Méfiez-vous de l'utilisation de scanf(); Je trouve cela trop difficile à utiliser dans le monde réel, car cela ne me donne pas le contrôle sur le traitement des erreurs dont je pense avoir besoin. Je recommande d'utiliser fgets() ou un équivalent pour lire les lignes de données, puis utiliser sscanf() - une fonction beaucoup plus civilisée - pour analyser les données.

Voir aussi une question vaguement liée: SO 3591642.

+0

parfait. Merci .. Le problème était un caractère newline dans le scanf. Je vais examiner ces autres fonctions que vous avez mentionnées. – Nick

+1

Jonathan est charitable quand il dit: «Faites attention à l'utilisation de scanf()»; J'utiliserais plutôt "éviter comme la peste" :-) L'utilisation naïve de scanf (format% s sans limite de largeur de champ) est un bug de débordement de buffer qui attend de se produire. –

-1

[EDIT: Cette réponse est incorrecte, comme je l'ai dit ci-dessous, j'apprends aussi bien]

Avez-vous essayé CTRL-Z? Cela envoie EOF à scanf qui, d'après sa page de manuel, devrait faire passer scanf dans le champ suivant. Comme vous avez entré seulement une chaîne comme format d'entrée, cela devrait terminer le scanf.

Je ne peux pas tester cela maintenant, mais vous pouvez essayer. Page

Homme est ici:

http://www.slac.stanford.edu/comp/unix/package/rtems/doc/html/libc/libc.info.scanf.html

+3

La valeur par défaut normale pour envoyer un EOF à partir d'un terminal sous Unix est Control-D; sur DOS, c'est Control-Z. Vous pouvez définir Unix pour imiter DOS avec '' stty eof^Z '', bien sûr. Cependant, plus généralement, Control-Z est utilisé pour suspendre le processus courant (premier plan) et vous permettre de faire des choses avec le shell. –

+1

Merci, toujours heureux d'apprendre quelque chose de nouveau (ou dans ce cas, réapprendre quelque chose). – babbitt