@WhozCraig gut genannten Mängel zu diesem Rat. Es kommt ohne Rationalität oder Detail. Weiter gilt dies nicht für "%s"
, da "%s"
führende Leerzeichen mit oder ohne führende Leerzeichen verbraucht.
Ein führender white-space, sei es ' '
, '\t'
, '\n'
etc. alle das Gleiche tun: direkter scanf()
zu konsumieren und char
white-space führt nicht optional zu speichern. Dies ist nützlich, als typische Verwendung früherer scanf()
nicht die '\n'
vom
scanf("%d", &some_int);
scanf("%c", &some_char); // some_char is bound to get the value '\n'
Alle scanf()
Eingangsbezeich ignorieren führende Leerzeichen, außer 3 Geben Sie des Benutzers verbrauchen: "%c"
, "%n"
, "%[]"
.
Einfach Direktive Do profitieren Sie mit dem führenden Platz wie im Folgenden. Vorheriger verbleibender Leerraum wird vor '$'
verbraucht.
int Money;
scanf(" $%d", &Money);
Oft, aber nicht immer ein führender Raum vor "%c"
von Vorteil ist, als wenn ein einzelner char
von Benutzereingaben zu lesen.
char ch;
scanf(" %c", &ch);
Was mit dem Rat am meisten falsch ist, ist, dass 1), wenn "%s"
mit, ein Breiter Parameter ist wesentlich robuste Code Versorgung und 2) sollte der Rückgabewert überprüft werden.
char buf[30];
int cnt = scanf("%29s", buf);
if (cnt != 1) Handle_NoInput_or_EOF_IOError();
Schließlich empfehlen fgets()
über scanf()
zu verwenden, wie man kann - was die in der Regel der Fall ist.
Das besser mit einer großen Einschränkung kommen Single Char '% c' holen ist wahrscheinlich die dominierende Argumentation hinter dieser Vorschlaghammer-Hammer, und die Unfähigkeit, die Details so zur Verfügung stellen, frage mich die Voodoo Lehre Ideologie dieses Textes."Immer tun" ohne irgendeine Art von Erklärung * warum * Sie sollten diesem Mantra folgen, und wie Dinge schief gehen können, wenn Sie * nicht *, sind oft verwirrender als hilfreich (Fall in Punkt, Ihre Buchung diese Frage .. .). Wie auch immer, Sie können [** diese Antwort **] (http://stackoverflow.com/questions/14419954/reading-a-single-character-in-c/14419972#14419972) hilfreich finden. –
WhozCraig
Ist dieses Buch wirklich * C11 Programmierung für Anfänger *? Wurde 'scanf' nicht durch' scanf_s' in C11 ersetzt? –