2016-03-24 7 views
4

drucken Ich habe einen Code, der beabsichtigt, einige Leerzeichen nach einer Zeichenfolge zu drucken (um zu löschen, was möglicherweise hier sein könnte, da ich den Cursor bewege).printf: kann nicht weniger als 1 Zeichen mit% * c

Also, ich etwas wie folgt verwendet:

int some_length = 0; 
char some_string[]="hello world"; 
printf("%*c%s\n", some_length, ' ', some_string); 

Was ich dachte, würde produzieren „Hallo Welt“, aber nein, es produziert „Hallo Welt“ (beachten Sie, dass in meinem realen Code sind die Räume gedruckt Nach der Zeichenfolge, da das Ziel ist zu löschen, nicht Einzug, ich mache das hier nur um Arbeitsprobe zu haben).

Also, ist dieses Verhalten beabsichtigt? Da some_length 0 ist, könnte man vernünftigerweise hoffen, nichts zu drucken, oder? Ist das ein undefiniertes Verhalten, oder könnte es ein aber in der Standardbibliothek sein (ich bezweifle es, aber ...)?

Antwort

6

* Der Modifikator für printf wird verwendet, um eine variable Mindestbreite für die Länge des nächsten Stücks von Ausgangs angeben erzeugt, anstatt eine feste Breite für die Länge des nächsten Stück Ausgabe erzeugt. Wenn Sie also * verwenden und eine 0 als numerischen Wert für die Länge angeben, hat dies keine Auswirkungen, da die Meldung "Leerzeichen drucken und niemals weniger als null Zeichen drucken" lautet.

+4

sein müssen, dass heißt, ich '% * s' funktionieren würde, wenn die Zeichenfolge übergeben glauben war nur "" "." – ShadowRanger

+0

Detail: "Der * Modifikator ... spezifiziert eine variable minimale Breite" wenn im Spezifizierer kein '.'' steht. Ein' '*' 'nach dem '' .'' steuert die _Präzision/maximum_ – chux

+0

In der Tat dachte nicht über das "Minimum" -Ding. Nicht wirklich an uns gewöhnt Auf diese Weise muss ich zugeben. Nun, ShadowRanger unten) ist wahr, es funktionierte mit "% * s", 0, "". Aber die Antwort von user2357112 ist genauer, also werde ich seine bestätigen. [redigieren Sie] die Erwiderung, die ich erwähnte, ist gelöscht worden, also nehme ich dieses stattdessen an ... – user3459474

1

Ich glaube, Sie vergessen die Bedeutung des% *. Wenn Sie es sehen, es zu sagen, den Compiler „Ich will mindestens diese viele Breite drucken. Wenn Sie also Null setzen, dann ist es, als ob nichts passiert ist, weil es offensichtlich 1 Zeichenbreite gedruckt werden kann.

Wenn sagen Sie die Nummer auf eine 5 ändern, wird es Pad mit 5 Räumen, weil es mindestens 5 Breiten gedruckt.

Verwandte Themen