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?

War es hilfreich?

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 ints

#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 als n sein) oder -1 im Fehlerfall kodiert
  • _snprintf gibt einen negativen Wert, wenn n nicht groß für die Zeichenfolge ist; oder n 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

finden
/* 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

gebaut

Ich 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top