Gibt es eine setfill () Alternative für C?
-
28-09-2019 - |
Frage
In C ++:
int main()
{
cout << setfill('#') << setw(10) << 5 << endl;
return 0;
}
Ausgänge:
#########5
Gibt es eine setfill()
Alternative für C? Oder wie dies ohne manuelle Erstellen Sie die Zeichenfolge in C zu tun?
Lösung
Nein, es gibt keine direkte Alternative.
Aber wenn man ein gut erzogener snprintf
(man, dass verhält sich wie von der C99-Standard beschrieben), das funktioniert, ohne eine neue Zeichenfolge zu schaffen; Erstellen von nur 2 temporärem int
s
#include <stdio.h>
int main(void) {
int filler = '#'; /* setfill('#') */
int width = 10; /* setw(10) */
int target = 5; /* 5 */
/* ******** */
int s = snprintf(NULL, 0, "%d", target);
for (int i = 0; i < width - s; i++) {
putchar(filler);
}
printf("%d\n", target);
/* ******** */
return 0;
}
EDIT:. Läuft Version unter ideone
EDIT2: Unterschiede zwischen dem C99-Standard des snprintf
und Windows _snprintf
( Danke für den Link, Ben ):
- Prototyp:
int snprintf(char *restrict buffer, size_t n, const char *restrict format, ...);
- Prototyp:
int _snprintf(char *buffer, size_t n, const char *format, ...);
-
snprintf
schreibt nicht mehr als (n-1) Bytes und ein NUL -
_snprintf
schreibt nicht mehr als (n) Bytes, von denen die letzte NUL sein kann oder ein anderes Zeichen -
snprintf
die Anzahl der Zeichen für Format benötigt zurück (kann größer alsn
sein) oder-1
im Fehlerfall kodiert -
_snprintf
gibt einen negativen Wert, wennn
nicht groß für die Zeichenfolge ist; odern
wenn ein NUL-Byte wurde nicht geschrieben puffern.
Sie können die Fehlverhalte _snprintf
in einer Schleife ausgeführt, die Erhöhung n
bis Sie den richtigen Wert
/* absolutely not tested, written directly on SO text editor */
int i;
size_t rightvalue = 0;
char buffer[SOME_DEFAULT_VALUE];
do {
if (sizeof buffer < rightvalue) /* OOPS, BIG BIG OOPS */;
i = _snprintf(buffer, rightvalue, "%d", 42);
} while (i != rightvalue++);
/* rightvalue already has space for the terminating NUL */
Andere Tipps
int x= 5;
printf("%010d",x);
AUSGABE: 0000000005
Nun, wenn Sie wirklich ‚#‘ wollen statt ‚0‘ Sie werden sie manuell in den String müssen ersetzt werden.
Vielleicht:
char buf[11], *sp = buf;
snprintf(buf, 11, "%10d", x);
while( (sp = strchr(sp, ' ')) != '\0'){ *sp = '#'; }
puts(buf);
Jeder will printf
nennen zweimal ... printf
ist eine der teuersten Funktionen um.
Hier:
char buffer[18] = "##########";
puts(buffer + snprintf(buffer+strlen(buffer), 8, "%d", 5));
Nicht als Standard
gebautIch würde wahrscheinlich sprintf () die Zahl in einen String und erhält die Anzahl der Zeichen gibt dann die korrekte Anzahl von ‚#‘, bevor die Zeichenfolge gedruckt wird.
Im Folgenden wird es memset
in C unter Verwendung tun, um ein 1-Byte-Zeichen angenommen. Es schafft noch einen ‚string‘, obwohl ich nicht sicher bin, wie Sie manuell wollen es nicht sein.
int main(void)
{
char buf[MAX_LENGTH];
memset(buf, '#', 10);
buf[10]='\0';
printf("%s5\n", buf);
}
Je was Sie wollen eigentlich damit machen, Sie dynamisch den Puffer schaffen könnten die entsprechende Größe zu sein und es von einer Hilfsfunktion zurück, wenn Sie dies wünschen.