2016-01-19 12 views
24

So stolperte ich über diesen Code, und ich habe nicht in der Lage gewesen, um herauszufinden, was es der Zweck ist, oder wie es funktioniert:Was bedeutet ein Stern in einem scanf-Formatbezeichner?

int word_count; 
scanf("%d%*c", &word_count); 

Mein erster Gedanke war, dass %*d wurde Referenzierung einen char Zeiger oder Verbieten word_count von char Variablen nehmen.

Kann jemand bitte etwas Licht darauf werfen?

+9

Siehe: [Der Unterschied zwischen% * c% c und% c] (http://stackoverflow.com/questions/11109750/the-difference-between-cc-and-c) –

+1

[** fscanf-Dokumentation * *] (http://en.cppreference.com/w/c/io/fscanf). – edmz

Antwort

19

*c bedeutet, dass ein Zeichen gelesen wird, aber nicht zugewiesen wird, zum Beispiel wird für den Eingang "30a" 30 zu word_count zugewiesen, aber 'a' wird ignoriert.

+1

@ PeterA.Schneider stimmt, danke –

22

Die * in "%*c" steht für assignment-suppressing character *: Wenn diese Option vorhanden ist, wird die Funktion nicht das Ergebnis der Umwandlung in jeden Empfang Argument zuweisen. Das Zeichen wird also gelesen, aber keiner Variablen zugewiesen.


Fußnoten:

1. fscanf

12

Um es mit dem C11 Standard, Kapitel §7.21.6.2, fscanf()

[ ...] Eac h Umrechnungsspezifikation wird durch das Zeichen % eingeführt. Nach dem% erscheint in der Reihenfolge Folgendes:

- Ein optionales Zeichen zur Unterdrückung der Zuweisung *.
- [...]
- A Konvertierungsspezifizierer Charakter

und das Verhalten in Bezug auf,

[..] Es sei denn, wurde durch eine * angegeben Zuordnung Unterdrückung, die Ergebnis der Konvertierung wird in das Objekt platziert, auf das das erste Argument nach das Format-Argument zeigt, das noch kein Konvertierungsergebnis erhalten hat. [...]

Das heißt, im Fall eines Formatbezeichner wie "%*c", ein char wird aus den stdin gelesen, aber der gescannte Wert wird auf nichts gespeichert oder zugewiesen bekommen. Sie müssen also keinen entsprechenden Parameter angeben.

Also, in diesem Fall

scanf("%d%*c", &word_count); 

ist eine absolut gültige Aussage.

Zum Beispiel, was es tut, in einer * nix-Umgebung ist den Eingangspuffer von den newline zu löschen, die durch Drücken ENTER Taste nach der Eingabe gespeichert wird.