it-swarm.com.de

Wie wiederholt man ein Zeichen mit printf?

Ich würde gerne etwas wie printf("?", count, char) tun, um ein Zeichen count mal zu wiederholen.

Was ist der richtige Formatstring, um dies zu erreichen?

EDIT: Ja, es ist offensichtlich, dass ich printf() in einer Schleife aufrufen könnte, aber genau das wollte ich vermeiden.

55
Muis

Kurze Antwort - Ja, lange Antwort: Nicht so, wie Sie es wollen.

Sie können die% * -Form von printf verwenden, die eine variable Breite akzeptiert. Und wenn Sie '0' als Wert zum Drucken verwenden, wird kombiniert mit dem rechtsbündigen Text, der links mit Nullen aufgefüllt ist.

printf("%0*d\n", 20, 0);

produziert:

00000000000000000000

Mit fester Zunge auf der Wange biete ich diesen kleinen Horror-Code-Ausschnitt an.

Manchmal muss man einfach Dinge schlecht machen, um sich daran zu erinnern, warum man sich den Rest der Zeit so sehr bemüht.

#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;
}
48

Sie können die folgende Technik verwenden:

printf("%.*s", 5, "=================");

Dies wird "=====" drucken. Es funktioniert für mich in Visual Studio, kein Grund, dass es nicht auf allen C-Compilern funktionieren sollte.

92
rep_movsd

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());

ausgabe:

aaaaa
14

Wenn Sie sich darauf beschränken, eine 0 oder ein Leerzeichen zu wiederholen, können Sie Folgendes tun:

Für Räume:

printf("%*s", count, "");

Für Nullen:

printf("%0*d", count, 0);
13
Ariel

Es gibt keine solche Sache. Sie müssen entweder eine Schleife mit printf oder puts schreiben oder eine Funktion schreiben, die die Anzahl der Zeichenfolgen in eine neue Zeichenfolge kopiert. 

10
Mats Petersson

Wenn Sie über einen Compiler verfügen, der die Allocation () - Funktion unterstützt, ist dies eine mögliche Lösung (allerdings ziemlich hässlich):

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

Im Prinzip werden 10 Bytes auf dem Stack zugewiesen, die mit '\ 0' gefüllt sind, und die ersten 9 Bytes werden mit 'x' gefüllt.

Wenn Sie einen C99-Compiler haben, könnte dies eine bessere Lösung sein:

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

printf tut das nicht - und printf ist zu viel für das Drucken eines einzelnen Zeichens.

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, so dass keine physische Ausgabe für jedes Zeichen ausgeführt wird, es sei denn, dies ist erforderlich.

5
Keith Thompson

sie können eine Funktion erstellen, die diese Aufgabe erfüllt, und sie verwenden 

#include <stdio.h>

void repeat (char input , int count )
{
    for (int i=0; i != count; i++ )
    {
        printf("%c", input);
    }
}

int main()
{
    repeat ('#', 5);
    return 0;
}

Dies wird ausgegeben 

#####
2
Loay Hussein
char buffer[31];
/*assuming you want to repeat the c character 30 times*/
memset(buffer,(int)'c',30); buffer[30]='\0';
printf("%s",buffer)
printf("%.*s\n",n,(char *) memset(buffer,c,n));

n <= sizeof(buffer) [vielleicht auch n <2 ^ 16]

Der Optimierer kann es jedoch in puts(buffer) ändern, und dann wird das Fehlen von EoS .....

Und die Annahme ist, dass Memset eine Assembler-Anweisung ist (aber immer noch eine Schleife auf Chip).

Streng gesehen gibt es keine Lösung unter der Voraussetzung 'No loop'.

1
Rene
char buffer[41];

memset(buffer, '-', 40);    // initialize all with the '-' character<br /><br />
buffer[40] = 0;             // put a NULL at the end<br />

printf("%s\n", buffer);     // show 40 dashes<br />
0
Charles