Frage

Was sind die Unterschiede zwischen der Verwendung scanf Mit den folgenden Formatspezifikatoren, wenn der gescannte Eingang gescannt wird 123456 gegen wann es ist 123:

  • %6d
  • %-6d
  • %0d

Was sind die Unterschiede in der Ausgabe?

War es hilfreich?

Lösung

Am Ende habe ich es nur mit GCC 4.3.4 ausprobiert und folgte Folgendes:

  • %6d: Funktioniert gut; liest nur 6 Zeichen (also, wenn Sie versuchen zu lesen 123456789 es wird nur lesen 123456)
  • %-6d: Emittiert die Warnung:

    warning: unknown conversion type character '-' in format
    

    Lesen Sie nichts und das int, an das geschrieben wird

  • %0d: Emittiert die Warnung:

    warning: zero width in scanf format
    

    Liest so, als gäbe es im Formatspezifizierer keine Breite (%d)

Ich habe die Spezifikation nicht überprüft, um festzustellen, ob diese Ergebnisse vorgeschrieben sind oder wie GCC sie umgeht (sie umgeht (BEARBEITEN: Andreyt fand es)

Andere Tipps

Das %-6d ist ein ungültiger Formatspezifizierer. Es gibt keine Formatspezifizierer mit - in ihnen in scanf.

Im %6d das 6 Teil heißt Maximale Feldbreite. Es funktioniert mit allen Formatspezifikatoren (nicht nur mit d) und gibt die maximale Anzahl von Zeichen an, die vor dem formatspezifischen Konvertierung gelesen werden müssen. Zum Beispiel, wenn die Eingabesequenz ist 1234567, dann %3d wird lesen und konvertieren 123 und %6d wird lesen und konvertieren 123456.

Das %0d ist ein ungültiger Formatspezifizierer. Maximale Feldbreite in scanf Muss eine Ganzzahl ungleich Null sein (siehe 7.19.6.2/3 in der Sprachspezifikation).

Das lässt uns also mit %6d als einziger bedeutungsvoller Format -Spezifizierer unter den drei, die Sie zur Verfügung gestellt haben. Unter diesen Umständen ist die Frage nach Unterschieden in der Ausgabe (in Ergebnissen?) Wenig Sinn.

BEARBEITEN: Man kann das wahrscheinlich argumentieren in %-6d das -6 Teil ist die maximale Feldbreite, die die Standardanforderung des Seins erfüllt Dezimalbezahlung ungleich Null. In der C -Sprachterminologie a jedoch a Dezimalbezahlung Als lexikalisches Element ist nur eine Abfolge von Ziffern und Ziffern. Es darf kein Zeichen enthalten. Dh weder -6 Noch +6 sind Dezimalzahlen. Jedes Mal, wenn Sie verwenden -6 oder +6 Als Ganzzahlen in Ihrem Programm ist es tatsächlich unär - und + Operator Lexeme, gefolgt von Decimal Ganzzahl Lexeme. Also seit der Spezifikation von scanf benötigt ein Dezimalbezahlung ungleich Null Als maximale Feldbreite muss es sich um eine zeichnische Ganzzahl handeln.

Hier ist, was meiner Meinung nach passieren wird: %6d wird Ihnen die ersten 6 Ziffern der Zahl bringen, %-6D wird wahrscheinlich nicht wie erwartet funktionieren, da - eher ein Ausrichtungsspezifizierer ist. %0d würde bedeuten, dass Sie nur 0 Zeichen wollen, was wahrscheinlich nicht wie erwartet funktionieren würde.

Beide %-6d und %0d sind ungültig Konversionspezifikationen für scanf, also wird das Verhalten für diese Fälle sein nicht definiert. Siehe die Sprache Standard, § 7.19.6.2, ¶ 3.

Ich gehe davon aus, dass Sie wie Arkadiy wirklich das Formatieren im Printf-Stil gemeint haben, da Sie sich auf "Ausgabe" beziehen. Ich werde auch annehmen, dass Sie C verwenden (wie das Tag schon sagt).

Wenn du läufst:

printf("%6d %-6d %0d", num1, num2);

... enden mit Compiler -Fehlern (oder noch schlimmer noch Laufzeitfehler), da Sie nicht genügend Argumente für drei Formate geliefert haben.

Ich habe das Gefühl, dass das nicht das ist, was Sie gefragt haben. Nehmen wir an, Sie rennen tatsächlich:

// (I've added some extra stuff to show how the formatting works.)
printf("'%6d'/'%-6d'/'%0d'", num2, num2, num2);

...Du wirst kriegen:

'   123'/'123   '/'123'

Wenn die Feldbreite (in diesem Fall in diesem Fall) breit genug ist, sind die Zahlen normalerweise rechtsgerichtet und platzgepackt. Wenn Sie ein '-' vor der Feldbreite setzen, werden sie rechts ausgerichtet und räumlich ausgerichtet.

Die Subtilität hier ist im Format "%0d". Sie denken vielleicht, Sie geben ein Feld Null an ... und Sie würden sich irren. Das erste, was nach dem '%' eine Optionsflag ist, und '0' ist eine gültige Flagge. Es bedeutet: "Wenn die Feldbreite breiter ist als der Inhalt, links mit Nullen." In diesem Fall haben Sie keine Feldbreite geliefert (das '0' ist eine Flagge, erinnern Sie sich?

Es gibt jedoch eine noch schlimmere Subtilität. Wenn Sie "%-06D" angegeben haben, würden Sie mit Nullen die richtige Paddierung bekommen, oder? Ähm, nein. Die '-' Flag überschreibt das "0" -Flag, welcher Reihenfolge sie geliefert haben. Sie würden '123' bekommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top