%i oder %d, um Integer in C mit printf() zu drucken?

Lesezeit: 4 Minuten

Benutzeravatar von Dummy Code
Dummy-Code

Ich lerne gerade C und habe ein wenig Wissen über Objective-C, da ich mich in der iOS-Entwicklung versucht habe, aber in Objective-C habe ich es verwendet NSLog(@"%i", x); um die Variable zu drucken x Zur Konsole habe ich jedoch ein paar C-Tutorials gelesen und sie sagen, sie zu verwenden %d Anstatt von %i.

printf("%d", x);

und printf("%i", x); beide drucken x richtig an die Konsole.

Diese beiden scheinen mich an den gleichen Ort zu bringen, also frage ich die erfahrenen Entwickler, was bevorzugt wird? Ist man semantisch richtiger oder ist Rechts?

Sie sind völlig gleichwertig, wenn sie mit verwendet werden printf(). Ich persönlich bevorzuge %des wird häufiger verwendet (sollte ich sagen “es ist der idiomatische Konvertierungsbezeichner für int“?).

(Ein Unterschied zw %i und %d ist das, wenn verwendet mit scanf()dann %d erwartet immer eine ganze Dezimalzahl, wohingegen %i erkennt die 0 und 0x Präfixe als oktal und hexadezimal, aber kein vernünftiger Programmierer verwendet scanf() sowieso sollte dies kein Problem sein.)

  • Danke 🙂 Also mehr nur die Präferenz eines Entwicklers?

    – Dummy-Code

    26. Juni 2013 um 20:20 Uhr

  • @HenryHarris Ja, aber wenn Sie meinen Rat befolgen, verwenden Sie %d 😉

    Benutzer529758

    26. Juni 2013 um 20:20 Uhr


  • Dies kann extrem spät sein, aber was ist falsch an der Verwendung von scanf()?

    – Zauberbinder2050

    28. September 2014 um 21:12 Uhr

  • @Spellbinder2050, siehe http://c-faq.com/stdio/scanfprobs.html. Grundsätzlich reagiert scanf() nicht gut auf unerwartete Eingaben.

    – Tschad

    23. November 2015 um 16:23 Uhr


  • Haben Sie sich den von Chad bereitgestellten Link angesehen? "It's nearly impossible to deal gracefully with all of these potential problems when using scanf; it's far easier to read entire lines (with fgets or the like),...(Functions like strtol, strtok, and atoi are often useful". Mann, ich hasse diese Art von Kommentaren, wo Leute sagen “Oh, alle anderen sind beschissen”aber lesen Sie nicht die bereitgestellten Ressourcen durch, genau wie OiciTrap.

    – Kyle Chadha

    12. Juli 2018 um 19:25 Uhr


Als Benutzeravatar von Bhullar
Als Bhullar

Ich füge hier nur Beispiele hinzu, weil ich denke, dass Beispiele das Verständnis erleichtern.

In printf() verhalten sie sich identisch, sodass Sie entweder %d oder %i verwenden können. Aber sie verhalten sich in scanf() anders.

Zum Beispiel:

int main()
{
    int num,num2;
    scanf("%d%i",&num,&num2);// reading num using %d and num2 using %i

    printf("%d\t%d",num,num2);
    return 0;
}

Ausgabe:

Geben Sie hier die Bildbeschreibung ein

Sie können die unterschiedlichen Ergebnisse für identische Eingaben sehen.

num:

Wir lesen num verwenden %d also wenn wir eintreten 010 es ignoriert die erste 0 und behandelt es als Dezimalzahl 10.

num2:

Wir lesen num2 verwenden %i.

Das bedeutet, dass Dezimalzahlen, Oktalzahlen und Hexadezimalzahlen unterschiedlich behandelt werden.

Wenn es gibt num2 010 es sieht die Führung 0 und analysiert es als oktal.

Wenn wir es mit drucken %d es gibt das Dezimaläquivalent von Oktal aus 010 welches ist 8.

  • Ich stimme Ihnen zu, aber ich hätte es vorgezogen, eine vollständige Antwort zu sehen, anstatt Patchwork über eine andere Antwort (genau dagegen kämpft das StackOverflow-Projekt).

    – Vog

    1. April 2015 um 8:58 Uhr

d und i Konvertierungsbezeichner verhalten sich genauso wie fprintf aber verhalten sich anders für fscanf.

Wie einige andere in ihrer Antwort schrieben, ist die idiomatische Art, an zu drucken int benutzt d Konvertierungsbezeichner.

Bezüglich i Spezifizierer und fprintfC99 Begründung sagt, dass:

Der %i-Konvertierungsbezeichner wurde in C89 aus Programmiererfreundlichkeit hinzugefügt, um eine Symmetrie mit dem %i-Konvertierungsbezeichner von fscanf bereitzustellen, obwohl er genau die gleiche Bedeutung wie der %d-Konvertierungsbezeichner hat, wenn er mit fprintf verwendet wird.

Benutzeravatar von Priyatham51
Priyatham51

beide %d und %i kann verwendet werden, um eine ganze Zahl zu drucken

%d steht für „dezimal“ und %i für „ganzzahlig“. Sie können %x verwenden, um hexadezimal zu drucken, und %o, um oktal zu drucken.

Sie können %i als Synonym für %d verwenden, wenn Sie statt „dezimal“ lieber „ganzzahlig“ angeben möchten.

Bei der Eingabe können Sie mit scanf() sowohl %i als auch %d verwenden. %i bedeutet, dass es als Ganzzahl mit beliebiger Basis analysiert wird (oktal, hexadezimal oder dezimal, wie durch ein 0- oder 0x-Präfix angegeben), während %d bedeutet, dass es als dezimale Ganzzahl analysiert wird.

Weitere Erklärungen finden Sie hier

Warum steht %d für Integer?

%d scheint die Norm für das Drucken von Ganzzahlen zu sein, ich habe nie herausgefunden warum, sie verhalten sich identisch.

Benutzeravatar von David Roundy
David Roundy

Wie andere sagten, erzeugen sie identische Ausgaben auf printf, verhalten sich aber auf scanf anders. ich würde bevorzugen %d Über %i deshalb. Eine Zahl, die mit gedruckt wird %d kann mit eingelesen werden %d und Sie erhalten die gleiche Nummer. Das stimmt nicht immer mit %i, wenn Sie sich jemals für die Verwendung von Null-Padding entscheiden. Da es üblich ist, printf-Formatzeichenfolgen in scanf-Formatzeichenfolgen zu kopieren, würde ich dies vermeiden %ida es Ihnen eine überraschende Fehlereinführung geben könnte:

Ich schreibe fprintf("%i ...", ...);

Sie kopieren und schreiben fscanf(%i ...", ...);

Ich beschließe, dass ich die Spalten besser ausrichten und die Alphabetisierung so verhalten möchte wie das Sortieren: fprintf("%03i ...", ...); (oder %04d)

Wenn Sie jetzt meine Zahlen lesen, wird alles zwischen 10 und 99 oktal interpretiert. Hoppla.

Wenn Sie eine Dezimalformatierung wünschen, sagen Sie es einfach.

1413930cookie-check%i oder %d, um Integer in C mit printf() zu drucken?

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

Privacy policy