web-dev-qa-db-fra.com

Comment répéter un caractère avec printf?

J'aimerais faire quelque chose comme printf("?", count, char) pour répéter un caractère count fois.

Quelle est la bonne chaîne de format pour accomplir cela?

EDIT: Oui, il est évident que je pourrais appeler printf() en boucle, mais c’est ce que je voulais éviter.

55
Muis

Réponse courte - oui, réponse longue: pas comme vous le souhaitez.

Vous pouvez utiliser la forme% * de printf , qui accepte une largeur variable. Et, si vous utilisez '0' comme valeur à imprimer, combiné avec le texte aligné à droite et complété à zéro,.

printf("%0*d\n", 20, 0);

produit: 

00000000000000000000

La langue bien en place, j'offre ce petit bout de code d'horreur. 

Parfois, vous devez juste faire des choses mal pour vous rappeler pourquoi vous essayez si durement le reste du temps.

#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;
}
47
synthesizerpatel

Vous pouvez utiliser la technique suivante:

printf("%.*s", 5, "=================");

Ceci imprimera "=====" Il fonctionne pour moi sur Visual Studio, aucune raison pour laquelle cela ne devrait pas fonctionner sur tous les compilateurs C.

92
rep_movsd

En c ++, vous pouvez utiliser std :: string pour obtenir des caractères répétés

printf("%s",std::string(count,char).c_str());

Par exemple:

printf("%s",std::string(5,'a').c_str());

sortie:

aaaaa
14

Si vous vous limitez à répéter un 0 ou un espace, vous pouvez faire:

Pour les espaces:

printf("%*s", count, "");

Pour les zéros:

printf("%0*d", count, 0);
13
Ariel

Il n'y a pas une telle chose. Vous devrez soit écrire une boucle en utilisant printf ou puts, soit écrire une fonction qui copie le nombre de fois de chaîne dans une nouvelle chaîne. 

10
Mats Petersson

Si vous avez un compilateur qui supporte la fonction alloca (), alors c'est une solution possible (quand même assez moche):

printf("%s", (char*)memset(memset(alloca(10), '\0', 10), 'x', 9));

Fondamentalement, il alloue 10 octets sur la pile qui sont remplis avec «\ 0», puis les 9 premiers octets sont remplis avec «x».

Si vous avez un compilateur C99, alors cela pourrait être une solution plus simple:

for (int i = 0;  i < 10;  i++, printf("%c", 'x'));
6
ramon

printf ne fait pas cela - et printf est excessif pour l'impression d'un seul caractère.

char c = '*';
int count = 42;
for (i = 0; i < count; i ++) {
    putchar(c);
}

Ne vous inquiétez pas du fait que cela soit inefficace; putchar() met sa sortie en mémoire tampon, de sorte qu'il n'effectue pas d'opération de sortie physique pour chaque caractère, sauf nécessité.

5
Keith Thompson

vous pouvez faire une fonction qui fait ce travail et l'utiliser 

#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;
}

Cela produira 

#####
2
Loay Hussein
char buffer[31];
/*assuming you want to repeat the c character 30 times*/
memset(buffer,(int)'c',30); buffer[30]='\0';
printf("%s",buffer)
2
printf("%.*s\n",n,(char *) memset(buffer,c,n));

n <= sizeof(buffer) [peut-être aussi n <2 ^ 16]

Cependant, l'optimiseur peut le changer en puts(buffer) et le manque d'EoS .....

Et l’hypothèse est que memset est une instruction assembleur (mais reste une boucle, que ce soit sur puce ).

Strictement vu, il n'y a pas de solution étant donné la condition préalable "Pas de boucle".

1
Rene
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 />
0
Charles