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.
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;
}
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.
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
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);
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.
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'));
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.
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
#####
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'.
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 />