Einfaches C scanf funktioniert nicht? [duplicate]

Lesezeit: 4 Minuten

Benutzer-Avatar
John

Wenn ich etwas versuche wie:

int anint;
char achar;

printf("\nEnter any integer:");
scanf("%d", &anint);
printf("\nEnter any character:");
scanf("%c", &achar);
printf("\nHello\n");
printf("\nThe integer entered is %d\n", anint);
printf("\nThe char entered is %c\n", achar);

Es ermöglicht die Eingabe einer ganzen Zahl und überspringt dann die zweite scanf ganz, das ist wirklich seltsam, denn wenn ich die beiden vertausche (die char scanf zuerst), es funktioniert gut. Was um alles in der Welt könnte falsch sein?

  • Ihre Zeiger haben die falsche Größe, anint ist ein char und achar ist ein int. mach das nicht.

    – Codierer mit variabler Länge

    19. September 2010 um 6:44 Uhr


  • @Variable Length Coder: Das tut mir leid, ich habe ein einfacheres Beispiel paraphrasiert und mit den beiden gemischt. Dieser Tippfehler hat nichts mit meinem Problem zu tun, das Beispiel wurde behoben.

    – John

    19. September 2010 um 6:44 Uhr


Benutzer-Avatar
codaddict

Beim Lesen der Eingabe mit scanfwird die Eingabe gelesen, nachdem die Return-Taste gedrückt wurde, aber der durch die Return-Taste generierte Zeilenumbruch wird nicht von verbraucht scanfwas bedeutet, wenn Sie das nächste Mal a lesen char von der Standardeingabe gibt es einen Zeilenumbruch, der gelesen werden kann.

Eine Möglichkeit, dies zu vermeiden, ist die Verwendung fgets um die Eingabe als Zeichenfolge zu lesen und dann zu extrahieren, was Sie verwenden möchten sscanf wie:

char line[MAX];

printf("\nEnter any integer:");
if( fgets(line,MAX,stdin) && sscanf(line,"%d", &anint)!=1 ) 
   anint=0;

printf("\nEnter any character:");
if( fgets(line,MAX,stdin) && sscanf(line,"%c", &achar)!=1 ) 
   achar=0;

Eine andere Möglichkeit, den Zeilenumbruch zu konsumieren, wäre to scanf("%c%*c",&anint);. Das %*c liest den Zeilenumbruch aus dem Puffer und verwirft ihn.

Vielleicht möchten Sie dies lesen:

C FAQ : Warum sagen alle, dass man scanf nicht verwenden soll?

  • Du bräuchtest die %*c nach dem %d Format (auch oder stattdessen), nicht wahr? Obwohl selbst das nicht zuverlässig ist – wenn der Benutzer nach der Zahl und vor dem Zeilenumbruch ein Leerzeichen oder etwas anderes eingegeben hat. Ich finde fgets() + sscanf() ist besser.

    – Jonathan Leffler

    19. September 2010 um 6:47 Uhr


  • @Jonathan: Du hast Recht. Wir würden es nach dem brauchen %d. Und ja fgets + sscanf ist immer besser.

    – codaddict

    19. September 2010 um 6:52 Uhr

  • @codeaddict: Tut mir leid für die lange Annahme, aber du hast mir wirklich etwas mehr Einblick gegeben, wie die Interna in C funktionieren. Ich schätze auch den C-FAQ-Link sehr, umso besser, wenn ich weise bin, neuen Leuten diese Dinge beizubringen, wenn ich das jemals tue später Menschen helfen.

    – John

    29. September 2010 um 1:49 Uhr

  • /* Char-Eingabe mit scanf nach int-Eingabe mit scanf übernehmen, einfach fflush(stdin)-Funktion verwenden */ #include #include void main() { int x; char y; clrscr(); printf(” gib ein int ein “); scanf(“%d”,&x); spülen (stdin); printf(“\n Geben Sie jetzt ein Zeichen ein”); scanf(“%c”,&y); printf(“\n X=%d und Y=%c”,x,y); getch(); }

    – Rai Singh

    1. Dezember 2021 um 13:20 Uhr


Die anderen Antworten sind richtig – %c überspringt keine Leerzeichen. Der einfachste Weg, dies zu tun, besteht darin, Leerzeichen vor dem zu platzieren %c:

scanf(" %c", &achar);

(Alle Leerzeichen in der Formatzeichenfolge machen scanf verbrauchen alle aufeinanderfolgenden Leerzeichen).

  • Wie genau hilft das Überspringen des Leerzeichens beim Verwerfen des Zeilenumbruchs? Zum Beispiel: scanf("\n%c", &achar); würde auch funktionieren.

    – cpx

    15. Dezember 2012 um 17:29 Uhr


  • @cpx: Weil ein Zeilenumbruch Leerzeichen ist. Jeder Leerraum in der Formatzeichenfolge verhält sich also wie jeder andere Leerraum \n ist genauso gut wie ein Leerzeichen (aber ein Buchstabe mehr).

    – Café

    15. Dezember 2012 um 22:29 Uhr


Die zweite wird nicht übersprungen scanf(); der Zweite scanf() liest den vom ersten hinterlassenen Zeilenumbruch scanf(). Die meisten Formatcodes überspringen Leerzeichen; das %c Format überspringt keine Leerzeichen.

Benutzer-Avatar
Dale Diaz

Berufung getchar() Vor scanf löscht auch den gespeicherten Zeilenumbruch. Leichter, aber situativer

char input_1;
char input_2;
getchar();
scanf("%c", &input_1);
getchar();
scanf("%c", &input_2);

löscht die Zeilenumbrüche, was in aufeinanderfolgenden Codezeilen nützlicher ist, wo Sie wissen, dass es sich nur um einen Wert in der Warteschlange und nicht um eine Zeichenfolge handelt

Versuchen Sie auch _flushall() nach jedem Aufruf von printf. . Grundsätzlich puffert C++ von MS standardmäßig die Stream-Ausgabe, und das Leeren bewirkt, dass der Ausgabestream leer wird.

1353040cookie-checkEinfaches C scanf funktioniert nicht? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy