2010-11-20 5 views

Répondre

11

Utilisez memset.

int n = 10; 
char c = '*'; 

char* buf = malloc(n+1); 
memset(buf, c, n); 
buf[n] = '\0'; 

free(buf); 
6

memset(buf, '*', 10); buf[10]=0;

Remplacer '*' et 10 avec les valeurs que vous voulez, et si la longueur est pas connue à l'avance et pourrait être grande, utilisez buf=malloc(n+1); pour obtenir votre tampon.

1
char *allocate(int c, size_t n) 
{ 
    if(!c) return calloc(n + 1); 
    char *s = malloc(n + 1); 
    memset(s, c, n); 
    s[n] = '\0'; 
    return s; 
} 

Honnêtement, pourquoi vous essayez de le faire le plus rapide? Pourquoi ne pas le faire, puis l'accélérer plus tard si nécessaire?

En particulier, si vous créez seulement cela à la sortie, vous pouvez simplement

void printtimes(int c, size_t n, FILE *f) 
{ 
    while(n--) fputc(c, f); 
} 
+0

L'utilisation répétée de 'fputc' est assez lente. Quand j'ai besoin d'un padding comme ça, je remplis généralement un petit buffer (64-256 octets) avec 'memset' puis plusieurs fois' fwrite', en utilisant une plus petite longueur pour le reste de la queue. Si rien d'autre, passez à 'putc' ou' putchar' pour que l'implémentation ait une chance de le remplacer par une macro. –

+0

En fait, cela ne m'est pas venu à l'esprit memset(); Je pensais utiliser une boucle for(), mais merci :) – JoeWagner0

+0

@R .. - True. J'essayais surtout de montrer que l'OP pouvait optimiser si cela était destiné à une sortie immédiate. –

Questions connexes