Ich würde gerne sowas machen printf("?", count, char) ein Zeichen zu wiederholen count mal.
Was ist der richtige Format-String, um dies zu erreichen?
EDIT: Ja, es liegt auf der Hand, dass ich anrufen könnte printf() in einer Schleife, aber genau das wollte ich vermeiden.
An wie viele hast du gedacht?
– WhozCraig
4. Februar 2013 um 0:28 Uhr
Den Zählerstand zur Kompilierzeit nicht zu kennen, ist kein Hindernis beim Schreiben einer Schleife.
– Keith Thompson
4. Februar 2013 um 0:54 Uhr
Ihre Frage ist ziemlich klar (und die eigentliche Antwort ist, dass es keine gibt printf Format, das tut, was Sie wollen), aber Ihre Kommentare lassen mich unsicher, was Sie fragen. Sie sprechen von einer Formatzeichenfolge und Argumenten, die an Ihre Funktion übergeben werden. Nach welcher Funktion fragst du? Es scheint, es gibt Dinge, die Sie uns nicht sagen.
– Keith Thompson
23. Mai 2013 um 14:55 Uhr
Ich fürchte, ich habe immer noch keine klare Vorstellung davon, was Sie zu tun versuchen, oder (keine Beleidigung für @synthesizerpatel), warum Sie Ihre Antwort akzeptiert haben, die nicht als ernsthafte Lösung gedacht war.
– Keith Thompson
23. Mai 2013 um 21:01 Uhr
(Ich habe das zufällig 4½ Jahre später wieder gesehen.) Meine Lösung, eine einfache Schleife zu verwenden, funktioniert perfekt, um die von Ihnen gestellte Frage zu beantworten. Ich verstehe nicht, wie wichtig es ist, Daten über ein Netzwerk zu senden oder auf der Festplatte zu speichern. Wenn irgendetwas davon immer noch wichtig ist, erwägen Sie bitte, Ihre Frage zu aktualisieren oder besser eine neue zu posten.
– Keith Thompson
29. Dezember 2017 um 19:04 Uhr
rep_movsd
Sie können die folgende Technik verwenden:
printf("%.*s", 5, "=================");
Dies wird gedruckt "====="
Es funktioniert für mich in Visual Studio, kein Grund, warum es nicht auf allen C-Compilern funktionieren sollte.
Es ist bedauerlich, dass diese Antwort nicht höher bewertet wird, da sie nicht nur korrekt ist, sondern auch plattformübergreifend funktioniert. Getestet auf OSX, Linux und OpenBSD in C sowie Perl (das den C printf anywho umschließt)
– Synthesizerpatel
22. Mai 2013 um 11:49 Uhr
Danke, ich erinnerte mich daran, das vor 10 Jahren gemacht zu haben, aber ich vergaß es und entdeckte es dann wieder.
– rep_movsd
23. Mai 2013 um 9:28 Uhr
Es ist nicht gerade flexibel. Wenn die Breite größer als der String selbst ist, wird nicht mehr als der String gedruckt (zumindest nicht in meinem einfachen Experiment mit gcc).
– Mats Petersson
23. Mai 2013 um 9:56 Uhr
Dies funktioniert besser als die Antwort von Synthesizerpatel. Wenn ich ein Leerzeichen anstelle einer Null ausprobiert habe und die Breite Null ist, wird immer noch ein einzelnes Leerzeichen gedruckt. Dieser nicht.
– Schwarz
12. Mai 2014 um 10:13 Uhr
Schöner Fang! @rep_movsd
– Juan Diego Godoy Robles
22. Oktober 2015 um 10:12 Uhr
Kurze Antwort – ja, lange Antwort: nicht so wie du es willst.
Sie können die %*-Form von verwenden Druckf, die eine variable Breite akzeptiert. Und wenn Sie “0” als Wert zum Drucken verwenden, kombiniert mit dem rechtsbündigen Text, der links mit Nullen aufgefüllt ist.
printf("%0*d\n", 20, 0);
produziert:
00000000000000000000
Mit fest in meine Wange gepflanzter Zunge biete ich diesen kleinen Horrorshow-Codeschnipsel an.
Manchmal muss man Dinge einfach tun schlecht sich daran zu erinnern, warum Sie sich den Rest der Zeit so sehr anstrengen.
Ich erinnere mich nicht genau, was ich dachte, aber in Ihrem Code ist die Obergrenze 4096. Ich nehme an, du könntest malloc der Puffer.
– Keith Thompson
29. Januar 2014 um 20:48 Uhr
Fair genug. Messerkampf == abgewendet!
– Synthesizerpatel
31. Januar 2014 um 11:14 Uhr
Dieser Stil ist schlechter als die direkte Zuweisung von Zeichen in einer Schleife.
– liuyang1
27. November 2015 um 11:03 Uhr
Ja. Diese Methode ist schrecklich, aber sie beantwortet die OP-Frage.
– Synthesizerpatel
24. Mai 2016 um 16:48 Uhr
Können Sie bitte erklären, was Sie mit Horror-Show meinen? Ich habe das Gefühl, Sie versuchen, vor etwas zu warnen, aber ich bin mir nicht sicher, wovor … versuchen Sie nur, auf die Gefahr eines Überlaufs bei der Verwendung von “%*” hinzuweisen?
– Cheshirekow
19. Juli 2018 um 18:17 Uhr
Wenn Sie sich darauf beschränken, entweder eine 0 oder ein Leerzeichen zu wiederholen, können Sie Folgendes tun:
Für Leerzeichen:
printf("%*s", count, "");
Für Nullen:
printf("%0*d", count, 0);
Warum druckt eine leere Zeichenfolge Leerzeichen? Ich verstehe das nicht. Sollte nicht das letzte Argument sein " " Anstatt von "" ?
– n00b.exe
17. Juni 2021 um 20:44 Uhr
@n00b.exe printf fungiert nicht als Wiederholungsbefehl, sondern als Formatbefehl. Stellen Sie sich vor, Sie versuchen, Textspalten mit unterschiedlicher Breite sauber auszurichten, sodass Sie alles mit dem linken Pad auffüllen möchten. Es ist also eine linke Auffüllung, eine leere Zeichenfolge.
– Arielle
18. Juni 2021 um 2:19 Uhr
Christian Gregersen
In C++ können Sie std::string verwenden, um wiederholte Zeichen zu erhalten
printf("%s",std::string(count,char).c_str());
Zum Beispiel:
printf("%s",std::string(5,'a').c_str());
Ausgang:
aaaaa
Es gibt keine solche Sache. Sie müssen entweder eine Schleife mit schreiben printf oder putsoder schreiben Sie eine Funktion, die die Anzahl der Zeichenfolgen in eine neue Zeichenfolge kopiert.
Sehr seltsam, dass ich die kompliziertesten Ausdrücke haben kann, aber etwas Einfaches wie das Wiederholen eines Zeichens wird nicht unterstützt.
– Meister
4. Februar 2013 um 0:33 Uhr
Wieso den? Sie können dies einfach tun, indem Sie eine Schleife um das hinzufügen, was Sie wiederholen möchten. Das meiste, was printf tut, sind Dinge, die Sie in Ihrem eigenen Code nicht tun könnten [very easily]. Lassen Sie die Bibliotheken den schwierigen Teil erledigen und das Anwendungsprogramm die einfachen Teile, ich denke, das ist hier das Thema.
– Mats Petersson
4. Februar 2013 um 0:38 Uhr
Und wenn Sie davon überzeugt sind, ist das C-Standard-Komitee vermutlich an Verbesserungsvorschlägen interessiert, und eine Beispielimplementierung innerhalb der glibc würde vielleicht die Chancen verbessern, dass es jemals zum Standard wird. Wenn Sie es umsetzen, hält vielleicht jemand anderes es für eine gute Idee. Es wurde nur in den letzten 50 Jahren seit der Einführung von printf vermisst, also ist es vielleicht nur ein Versehen … 😉
– Mats Petersson
4. Februar 2013 um 0:40 Uhr
@MatsPetersson Das ist keine Lösung, weil ich den Formatstring nicht im Voraus kenne, siehe meine Antwort auf Mokammel.
– Meister
4. Februar 2013 um 0:40 Uhr
Warum wird dies abgelehnt – wenn Sie diese Antwort ablehnen, lassen Sie mich bitte wissen, womit Sie unzufrieden sind …
– Mats Petersson
23. Mai 2013 um 9:53 Uhr
Keith Thompson
printf tut das nicht – und printf ist übertrieben, um ein einzelnes Zeichen zu drucken.
char c="*";
int count = 42;
for (i = 0; i < count; i ++) {
putchar(c);
}
Machen Sie sich keine Sorgen, dass dies ineffizient ist; putchar() puffert seine Ausgabe, sodass keine physische Ausgabeoperation für jedes Zeichen durchgeführt wird, es sei denn, dies ist erforderlich.
Sehr seltsam, dass ich die kompliziertesten Ausdrücke haben kann, aber etwas Einfaches wie das Wiederholen eines Zeichens wird nicht unterstützt.
– Meister
4. Februar 2013 um 0:33 Uhr
Wieso den? Sie können dies einfach tun, indem Sie eine Schleife um das hinzufügen, was Sie wiederholen möchten. Das meiste, was printf tut, sind Dinge, die Sie in Ihrem eigenen Code nicht tun könnten [very easily]. Lassen Sie die Bibliotheken den schwierigen Teil erledigen und das Anwendungsprogramm die einfachen Teile, ich denke, das ist hier das Thema.
– Mats Petersson
4. Februar 2013 um 0:38 Uhr
Und wenn Sie davon überzeugt sind, ist das C-Standard-Komitee vermutlich an Verbesserungsvorschlägen interessiert, und eine Beispielimplementierung innerhalb der glibc würde vielleicht die Chancen verbessern, dass es jemals zum Standard wird. Wenn Sie es umsetzen, hält vielleicht jemand anderes es für eine gute Idee. Es wurde nur in den letzten 50 Jahren seit der Einführung von printf vermisst, also ist es vielleicht nur ein Versehen … 😉
– Mats Petersson
4. Februar 2013 um 0:40 Uhr
@MatsPetersson Das ist keine Lösung, weil ich den Formatstring nicht im Voraus kenne, siehe meine Antwort auf Mokammel.
– Meister
4. Februar 2013 um 0:40 Uhr
Warum wird dies abgelehnt – wenn Sie diese Antwort ablehnen, lassen Sie mich bitte wissen, womit Sie unzufrieden sind …
– Mats Petersson
23. Mai 2013 um 9:53 Uhr
ramon
Wenn Sie einen Compiler haben, der die Funktion alloca() unterstützt, dann ist dies eine mögliche Lösung (ziemlich hässlich):
An wie viele hast du gedacht?
– WhozCraig
4. Februar 2013 um 0:28 Uhr
Den Zählerstand zur Kompilierzeit nicht zu kennen, ist kein Hindernis beim Schreiben einer Schleife.
– Keith Thompson
4. Februar 2013 um 0:54 Uhr
Ihre Frage ist ziemlich klar (und die eigentliche Antwort ist, dass es keine gibt
printf
Format, das tut, was Sie wollen), aber Ihre Kommentare lassen mich unsicher, was Sie fragen. Sie sprechen von einer Formatzeichenfolge und Argumenten, die an Ihre Funktion übergeben werden. Nach welcher Funktion fragst du? Es scheint, es gibt Dinge, die Sie uns nicht sagen.– Keith Thompson
23. Mai 2013 um 14:55 Uhr
Ich fürchte, ich habe immer noch keine klare Vorstellung davon, was Sie zu tun versuchen, oder (keine Beleidigung für @synthesizerpatel), warum Sie Ihre Antwort akzeptiert haben, die nicht als ernsthafte Lösung gedacht war.
– Keith Thompson
23. Mai 2013 um 21:01 Uhr
(Ich habe das zufällig 4½ Jahre später wieder gesehen.) Meine Lösung, eine einfache Schleife zu verwenden, funktioniert perfekt, um die von Ihnen gestellte Frage zu beantworten. Ich verstehe nicht, wie wichtig es ist, Daten über ein Netzwerk zu senden oder auf der Festplatte zu speichern. Wenn irgendetwas davon immer noch wichtig ist, erwägen Sie bitte, Ihre Frage zu aktualisieren oder besser eine neue zu posten.
– Keith Thompson
29. Dezember 2017 um 19:04 Uhr