2014-10-15 11 views
5

Ich lese gerade dieses Buch "C11 Programmierung für Anfänger" und im scanf() Kapitel heißt es:Warum wird ein führendes Leerzeichen in einer scanf-Formatzeichenfolge empfohlen?

"Fügen Sie immer ein Leerzeichen vor dem ersten Steuerzeichen, um eine genaue Zeicheneingabe zu gewährleisten." Wie in:

scanf(" %s", whatever); 

Die Kontrollzeichenfolge% s hat ein Leerzeichen davor. Ich weiß, es klingt ziemlich selbsterklärend, aber ich verstehe nicht wirklich, was schief gehen könnte, und wie dieser Raum eine genaue Zeicheneingabe gewährleistet.

Vielen Dank im Voraus.

+3

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

+0

Ist dieses Buch wirklich * C11 Programmierung für Anfänger *? Wurde 'scanf' nicht durch' scanf_s' in C11 ersetzt? –

Antwort

3

@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.

+0

Danke chux :) Soweit ich verstanden habe, wird scanf bei Verwendung von scanf() mit "% c", "% n" oder "% []" ein führendes Leerzeichen in einem Zeichen speichern. Wie speichert es in der gleichen Char, wenn ein Char nur ein einzelnes Zeichen enthalten kann? – Stanley

+2

@Stanley 'scanf ("% c ", &ch);' wird den optionalen führenden Leerraum verbrauchen und verwerfen. Dann wird ein '' char'' in 'ch' gespeichert.' Scanf ("% c", &ch); ' speichert das erste 'char', das in' ch' kommt. '"% n "' oder '"% [] "' funktionieren ganz anders. – chux

+0

Tatsächlich gilt es für '% s', wenn ein Scanset angewendet wird Ich benutze häufig 'scanf_s ("% [^ \ n] s ", Ziel);' um eine ganze Zeile zu lesen, ohne mit Zeilenvorschubzeichen umgehen zu müssen - vorangestellt oder nachlaufend. –

1

"Fügen Sie immer ein Leerzeichen vor dem ersten Steuerzeichen ein, um eine genaue Zeicheneingabe zu gewährleisten."

Dies ist die nachgestellten Zeichen in den stdin verbrauchen, die von früheren Benutzereingaben (wie die carriage return) verlassen haben könnte, bevor die scanf die Benutzereingabe liest.

Verwandte Themen