Ich würde gerne etwas tun printf("?", count, char)
, um einen Charakter count
mal zu wiederholen .
Was ist die richtige Formatzeichenfolge, um dies zu erreichen?
EDIT: Ja, es ist offensichtlich, dass ich printf()
in einer Schleife aufrufen könnte , aber genau das wollte ich vermeiden.
printf
Format gibt, das 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 fragen Sie? Es scheint, dass es Dinge gibt, die Sie uns nicht erzählen.Antworten:
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 zum Drucken '0' als Wert verwenden, kombiniert mit dem rechtsbündigen Text, der links mit Null aufgefüllt ist.
printf("%0*d\n", 20, 0);
produziert:
00000000000000000000
Mit fest in die Wange gesteckter Zunge biete ich diesen kleinen Horror-Show-Code-Ausschnitt an.
Manchmal muss man die Dinge nur 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; }
quelle
4096
. Ich nehme an, Sie könntenmalloc
den Puffer.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.quelle
Wenn Sie sich darauf beschränken, entweder 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);
quelle
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:
quelle
Es gibt keine solche Sache. Sie müssen entweder eine Schleife mit
printf
oderputs
schreiben oder eine Funktion schreiben, die die Anzahl der Zeichenfolgen in eine neue Zeichenfolge kopiert.quelle
printf
macht das nicht - undprintf
ist übertrieben, um ein einzelnes Zeichen zu drucken.char c = '*'; int count = 42; for (i = 0; i < count; i ++) { putchar(c); }
Mach dir keine Sorgen, dass dies ineffizient ist.
putchar()
puffert seine Ausgabe, sodass keine physische Ausgabeoperation für jedes Zeichen ausgeführt wird, es sei denn, dies ist erforderlich.quelle
printf
, lautet die Formatzeichenfolge"%c"
. Aber Sie müssen nicht verwendenprintf
, und in diesem Fall benötigen Sie überhaupt keine Formatzeichenfolge. (Es gibt einfach keineprintf
Formatzeichenfolge, die ein Zeichen mehrmals druckt, aber es gibt andere und bessere Möglichkeiten, um die Aufgabe zu erfüllen.)Wenn Sie einen Compiler haben, der die Funktion alloca () unterstützt, ist dies eine mögliche Lösung (allerdings ziemlich hässlich):
printf("%s", (char*)memset(memset(alloca(10), '\0', 10), 'x', 9));
Grundsätzlich werden 10 Bytes auf dem Stapel zugewiesen, 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'));
quelle
putchar('x')
stattdessen vorschlagenprintf("%c", 'x')
.#include <stdio.h> #include <string.h> void repeat_char(unsigned int cnt, char ch) { char buffer[cnt + 1]; /*assuming you want to repeat the c character 30 times*/ memset(buffer,ch,cnd); buffer[cnt]='\0'; printf("%s",buffer) }
quelle
Sie können eine Funktion erstellen, die diesen Job ausführt, 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
quelle
i < count
. Andernfalls kann eine negative Eingabe für die Anzahl zu vielen unerwünschten Ausdrucken führen.printf("%.*s\n",n,(char *) memset(buffer,c,n));
n
<=sizeof(buffer)
[vielleicht auch n <2 ^ 16]Der Optimierer kann es jedoch ändern
puts(buffer)
und dann wird das Fehlen von EoS .....Und die Annahme ist, dass memset ein Assembler-Befehl ist (aber immer noch eine Schleife, sei es auf dem Chip).
Streng genommen gibt es keine Lösung unter der Voraussetzung 'Keine Schleife'.
quelle
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 />
quelle
Ich denke, so etwas zu tun.
void printchar(char c, int n){ int i; for(i=0;i<n;i++) print("%c",c); } printchar("*",10);
quelle