2010-01-28 17 views
43

Was ist der praktische Nutzen der Formate "%*" in scanf(). Wenn dieses Format existiert, muss es einen Zweck dahinter haben. Das folgende Programm gibt eine seltsame Ausgabe.Was sind scanf ("% * s") und scanf ("% * d") Formatbezeichner?

#include<stdio.h> 
int main() 
{ 
     int i; 
     char str[1024]; 

     printf("Enter text: "); 
     scanf("%*s", &str); 
     printf("%s\n", str); 

     printf("Enter interger: "); 
     scanf("%*d", &i); 
     printf("%d\n", i); 
     return 0; 
} 

Output:

[email protected]:~$ gcc -Wall -pedantic d.c 
d.c: In function ‘main’: 
d.c:8: warning: too many arguments for format 
d.c:12: warning: too many arguments for format 
[email protected]:~$ ./a.out 
Enter text: manav 
D 
Enter interger: 12345 
372 
[email protected]:~$ 
+0

Manav, basierend auf einige Ihrer letzten Fragen, würden Sie gut tun, um ein Lehrbuch zu lesen. –

+0

@Alok: Nun, ich habe ein Lehrbuch gelesen, war aber nicht in solche Details gegangen. Die meisten Lehrbücher bieten keine Beispiele für die Verwendung in Echtzeit. Ich denke, das Beste wäre, das Lehrbuch "The C Compiler Design" zu lesen. –

+1

@Manav: Sie brauchen definitiv kein "C Compiler Design" Buch. Haben Sie K & R ausprobiert? –

Antwort

83

Für printf, die * Sie minimale Feldbreite durch einen zusätzlichen Parameter, dh printf("%*d", 4, 100); gibt eine Feldbreite von 4.

Für scanf, die * zeigt angeben können, dass das Feld zu lesen ist, aber ignoriert, so dass zB scanf("%*d %d", &i) für den Eingang "12 34" 12 ignoriert und 34 in die Ganzzahl i liest.

+0

Bitte ändern Sie dies "printf ("% * d ", 4, 100);" zu "printf ("%. * d ", 4, 100);" .* sollte benutzt werden. – Sridharan

5

Die * verwendet wird, eine Eingabe zu überspringen, ohne sie in irgendeiner Variable zu setzen. So würde scanf("%*d %d", &i); zwei ganze Zahlen lesen und die zweite in i setzen.

Der Wert, der in Ihrem Code ausgegeben wurde, ist nur der Wert, der in der nicht initialisierten i Variable war - der Scanf-Aufruf änderte es nicht.

18

Der Stern ist ein Flag-Zeichen, das besagt, dass der von der Spezifikation gelesene Text ignoriert wird. Um qoute von der glibc Dokumentation:

Ein optionales Flaggenzeichen `*‘, die den Text für diese Beschreibung lesen zu ignorieren sagt. Wenn scanf eine Konvertierungsspezifikation findet, die dieses Flag verwendet, liest es die Eingabe wie von der restlichen Konvertierungsspezifikation angewiesen, aber es verwirft diese Eingabe, verwendet kein Zeigerargument und erhöht die Anzahl erfolgreicher Zuweisungen nicht.

Es ist nützlich in Situationen, in denen die Spezifikation Zeichenfolge mehr als ein Element enthält, zB .: scanf("%d %*s %d", &i, &j) für die "12 test 34" - wo i & j ganze Zahlen sind, und Sie wollen den Rest ignorieren. Siehe

6

here

Ein optionales Ausgang Sternchen zeigen an, dass die Daten von stdin abgerufen werden sollen, aber ignoriert, das heißt es wird nicht in dem entsprechenden Argumente gespeichert.

2

In scanf("%*d",&a)* überspringt den Eingang. Um die Eingänge zu lesen, muss man einen zusätzlichen "%d" in scanf verwenden. Zum Beispiel:

int a=1,b=2,c=3; 
    scanf("%d %*d %d",&a,&b,&c); //input is given as: 10 20 30 

O/p:

a=10 b=30 and c=3; // 20 is skipped 

Wenn Sie eine andere %d heißt: scanf("%d %*d %d %d",&a,&b,&c); //input is given as: 10 20 30 40 dann a = 10 b = 30 c = 40.

Wenn Sie "," in scanf verwenden, wird kein Wert nach %*d i genommen.e; scanf("%d %*d,%d" &a,&b,&c)// 10 20 30 O/p: a = 10 b = 2 c = 3 wird der Ausgang sein.