Me gustaría hacer algo como printf("?", count, char)
repetir un personaje count
veces.
¿Cuál es la cadena de formato correcta para lograr esto?
EDITAR: Sí, es obvio que podría llamar printf()
en un bucle, pero eso es justo lo que quería evitar.
Me gustaría hacer algo como printf("?", count, char)
repetir un personaje count
veces.
¿Cuál es la cadena de formato correcta para lograr esto?
EDITAR: Sí, es obvio que podría llamar printf()
en un bucle, pero eso es justo lo que quería evitar.
printf
formato que haga lo que quieres), pero tus comentarios me dejan inseguro de lo que estás preguntando. Hablas de una cadena de formato y argumentos que se pasan a tu función. ¿Sobre qué función estás preguntando? Parece que hay cosas que no nos estás diciendo.
Respuestas:
Respuesta corta: sí, respuesta larga: no como la quieres.
Puede utilizar la forma% * de printf , que acepta un ancho variable. Y, si usa '0' como su valor para imprimir, combinado con el texto alineado a la derecha que tiene un relleno de cero a la izquierda ...
printf("%0*d\n", 20, 0);
produce:
00000000000000000000
Con mi lengua firmemente plantada en mi mejilla, ofrezco este pequeño fragmento de código de un espectáculo de terror.
Algunas veces solo tienes que hacer las cosas mal para recordar por qué te esfuerzas tanto el resto del tiempo.
#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;
}
4096
. Supongo que podrías hacer malloc
el amortiguador.
Puede utilizar la siguiente técnica:
printf("%.*s", 5, "=================");
Esto imprimirá "====="
Me funciona en Visual Studio, no hay razón para que no funcione en todos los compiladores de C.
En c ++ puede usar std :: string para obtener un carácter repetido
printf("%s",std::string(count,char).c_str());
Por ejemplo:
printf("%s",std::string(5,'a').c_str());
salida:
aaaaa
No existe tal cosa. Tendrá que escribir un bucle usando printf
o puts
, o escribir una función que copie los tiempos de recuento de cadenas en una nueva cadena.
printf
no hace eso, y printf
es excesivo para imprimir un solo carácter.
char c = '*';
int count = 42;
for (i = 0; i < count; i ++) {
putchar(c);
}
No se preocupe si esto es ineficaz; putchar()
almacena en búfer su salida, por lo que no realizará una operación de salida física para cada carácter a menos que sea necesario.
printf
, la cadena de formato es "%c"
. Pero no necesita usar printf
, y en ese caso no necesita una cadena de formato en absoluto. (Simplemente no hay una printf
cadena de formato que imprima un carácter varias veces, pero hay otras y mejores formas de realizar la tarea).
Si tiene un compilador que admita la función alloca (), entonces esta es una posible solución (aunque bastante fea):
printf("%s", (char*)memset(memset(alloca(10), '\0', 10), 'x', 9));
Básicamente, asigna 10 bytes en la pila que se rellenan con '\ 0' y luego los primeros 9 bytes se rellenan con 'x'.
Si tiene un compilador C99, esta podría ser una solución más ordenada:
for (int i = 0; i < 10; i++, printf("%c", 'x'));
putchar('x')
lugar de printf("%c", 'x')
.
#include <stdio.h>
#include <string.h>
void repeat_char(unsigned int cnt, char ch) {
char buffer[cnt + 1];
/*assuming you want to repeat the c character 30 times*/
memset(buffer,ch,cnd); buffer[cnt]='\0';
printf("%s",buffer)
}
puedes crear una función que haga este trabajo y usarla
#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;
}
Esto saldrá
#####
i < count
. De lo contrario, una entrada negativa para el recuento podría dar como resultado muchas impresiones no deseadas.
printf("%.*s\n",n,(char *) memset(buffer,c,n));
n
<= sizeof(buffer)
[quizás también n <2 ^ 16]
Sin embargo, el optimizador puede cambiarlo a puts(buffer)
y luego la falta de EoS .....
Y la suposición es que memset es una instrucción de ensamblador (pero sigue siendo un bucle en el chip).
Estrictamente visto, no hay solución dada la condición previa 'Sin bucle'.
Creo que haciendo algo como esto.
void printchar(char c, int n){
int i;
for(i=0;i<n;i++)
print("%c",c);
}
printchar("*",10);