Was sind die Formatbezeichner scanf(“%*s”) und scanf(“%*d”)?

Lesezeit: 4 Minuten

Benutzeravatar von manav mn
manav mn

Was ist der praktische Nutzen der Formate "%*" in scanf(). Wenn dieses Format existiert, muss ein Zweck dahinterstecken. Das folgende Programm gibt eine seltsame Ausgabe aus.

#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;
}

Ausgabe:

manav@workstation:~$ 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
manav@manav-workstation:~$ ./a.out
Enter text: manav
D
Enter interger: 12345
372
manav@workstation:~$

  • Manav, basierend auf einigen Ihrer letzten Fragen, würden Sie gut daran tun, ein Lehrbuch zu lesen.

    – Alok Singhal

    28. Januar 2010 um 15:20 Uhr

  • @Alok: Nun, ich habe ein Lehrbuch gelesen, war aber nicht auf solche Details eingegangen. 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.

    – manav mn

    28. Januar 2010 um 15:29 Uhr

  • @Manav: Sie brauchen definitiv kein Buch “C Compiler Design”. Hast du K&R probiert?

    – Alok Singhal

    28. Januar 2010 um 15:33 Uhr

  • @Alok: Ich werde anfangen, K & R zu lesen, aber ich habe immer noch das Gefühl, dass ein C-Programmierkurs ohne ausreichende Kenntnisse über Betriebssysteme und “C-Compiler-Design” unvollständig ist.

    – manav mn

    28. Januar 2010 um 15:39 Uhr

  • @Manav: man 3 printf würde deine Frage auch beantworten.

    – jamesdlin

    28. Januar 2010 um 19:53 Uhr

Benutzeravatar von Håvard S
Havard S

Für printf können Sie mit * die minimale Feldbreite durch einen zusätzlichen Parameter angeben, z printf("%*d", 4, 100); gibt eine Feldbreite von 4 an. Eine Feldbreite von 4 bedeutet, dass, wenn eine Zahl zum Drucken weniger als 4 Zeichen benötigt, Leerzeichen gedruckt werden, bis die Feldbreite gefüllt ist. Wenn die Zahl mehr Platz einnimmt als die angegebene Feldbreite, wird die Zahl unverändert ohne Abschneiden gedruckt.

Zum scanfdas * gibt an, dass das Feld gelesen, aber ignoriert werden soll, sodass z scanf("%*d %d", &i) für die Eingabe “12 34” wird 12 ignoriert und 34 in die Ganzzahl i eingelesen.

  • bitte ändern Sie dieses “printf(“%*d”, 4, 100);” zu “printf(“%.*d”, 4, 100);” .* sollte benutzt werden.

    – SRIDHARAN

    20. Juli 2017 um 5:42 Uhr


  • Zum scanf die Felder mit * werden nicht im Rückgabewert gezählt.

    – Bob Stein

    6. April 2019 um 21:45 Uhr

  • Was ist ein Feldbreite?

    – Jananath Banuka

    3. Juni 2019 um 5:50 Uhr

  • Die Antwort von @JananathBanuka wurde mit einem Beispiel aktualisiert, das den Begriff erklärt.

    – Håvard S

    10. September 2019 um 16:02 Uhr

Benutzeravatar von Zoltán Szőcs
Zoltán Szőcs

Der Stern ist ein Flaggenzeichen, das besagt, dass der von der Spezifikation gelesene Text ignoriert werden soll. Um aus der glibc-Dokumentation zu zitieren:

Ein optionales Markierungszeichen `*’, das besagt, dass der für diese Spezifikation gelesene Text ignoriert werden soll. Wenn scanf eine Konvertierungsspezifikation findet, die dieses Flag verwendet, liest es die Eingabe wie vom Rest der Konvertierungsspezifikation angewiesen, aber es verwirft diese Eingabe, verwendet kein Zeigerargument und erhöht die Anzahl erfolgreicher Zuweisungen nicht.

Dies ist in Situationen nützlich, in denen die Spezifikationszeichenfolge mehr als ein Element enthält, z. B.:
scanf("%d %*s %d", &i, &j) für die "12 test 34" – wo ich & j ganze Zahlen sind und Sie den Rest ignorieren möchten.

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

Der Wert, der in Ihrem Code ausgegeben wurde, ist nur der Wert, der sich in der nicht initialisierten Datei befand i Variable – der Scanf-Aufruf hat es nicht geändert.

Sehen hier

Ein optionales beginnendes Sternchen zeigt an, dass die Daten von stdin abgerufen, aber ignoriert werden sollen, dh sie werden nicht im entsprechenden Argument gespeichert.

Benutzeravatar von Raunak Chowdhury
Raunak Chowdhury

Im scanf("%*d",&a) * überspringt die Eingabe. Um die Eingänge auszulesen muss man ein extra verwenden "%d" in scanf. 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 einen anderen verwenden %d dh: scanf("%d %*d %d %d",&a,&b,&c); //input is given as: 10 20 30 40
dann a=10 b=30 c=40.

Wenn du benutzt "," in scanf wird danach kein Wert genommen %*d dh;
scanf("%d %*d,%d" &a,&b,&c)// 10 20 30
O/p: a=10 b=2 c=3 wird die Ausgabe sein.

1408160cookie-checkWas sind die Formatbezeichner scanf(“%*s”) und scanf(“%*d”)?

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

Privacy policy