Wie wiederholt man ein Zeichen mit printf?

Lesezeit: 7 Minuten

Benutzeravatar von Maestro
Maestro

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

Benutzeravatar von rep_movsd
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.

#include <stdio.h>

int width = 20;
char buf[4096];

void subst(char *s, char from, char to) {
    while (*s == from)
    *s++ = to;
}

int main() {
    sprintf(buf, "%0*d", width, 0);
    subst(buf, '0', '-');
    printf("%s\n", buf);
    return 0;
}

  • 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

Benutzeravatar von Kristian Gregersen
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

Benutzeravatar von Keith Thompson
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

ramons Benutzeravatar
ramon

Wenn Sie einen Compiler haben, der die Funktion alloca() unterstützt, dann ist dies eine mögliche Lösung (ziemlich hässlich):

printf("%s", (char*)memset(memset(alloca(10), '\0', 10), 'x', 9));

Es weist im Grunde 10 Bytes auf dem Stapel zu, die mit ‘\0’ gefüllt sind, und dann werden die ersten 9 Bytes mit ‘x’ gefüllt.

Wenn Sie einen C99-Compiler haben, ist dies möglicherweise eine bessere Lösung:

for (int i = 0;  i < 10;  i++, printf("%c", 'x'));

  • ich würde vorschlagen putchar('x') Anstatt von printf("%c", 'x').

    – Paddu

    12. August 2014 um 13:19 Uhr

  • Wieso den? Ist die Ausführungszeit geringer?

    – 71GA

    18. Februar 2020 um 15:49 Uhr

  • ja, weniger Overhead, da Sie die variadische Funktion printf nicht aufrufen. Die 10 Aufrufe zum Schreiben sind jedoch sehr schädlich für die Leistung.

    – Antonin GAVREL

    13. Februar 2021 um 6:13 Uhr

1420580cookie-checkWie wiederholt man ein Zeichen mit printf?

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

Privacy policy