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