¿Cómo repetir un carácter usando printf?

Me gustaría hacer algo como printf("?", count, char)repetir un personaje countveces.

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

Answer

Puedes utilizar la siguiente técnica:

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

Esto imprimirá "=====" Funciona para mí en Visual Studio, no hay razón para que no funcione en todos los compiladores de C.

Respuesta corta: sí, respuesta larga: no como lo quieres.

Puede usar 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 ceros 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 espectáculo de terror.

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

Si te limitas a repetir ya sea un 0 o un espacio puedes hacer:

Para espacios:

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

Para ceros:

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

En c ++, podría 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());

producción:

aaaaa

No existe tal cosa. Tendrá que escribir un ciclo usando printfo puts, o escribir una función que copie los tiempos de conteo de cadenas en una nueva cadena.

printfno hace eso, y printfes excesivo para imprimir un solo carácter.

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

No se preocupe de que esto sea ineficiente; putchar()amortigua su salida, por lo que no realizará una operación de salida física para cada carácter a menos que sea necesario.

Si tiene un compilador que admite la función alloca(), entonces esta es una solución posible (aunque bastante fea):

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

Básicamente asigna 10 bytes en la pila que se llenan con '\0' y luego los primeros 9 bytes se llenan 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'));
#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 hacer 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 generará

#####
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 />
printf("%.*s\n",n,(char *) memset(buffer,c,n));

n<= sizeof(buffer)[tal vez también n < 2^16]

Sin embargo, el optimizador puede cambiarlo puts(buffer)y luego la falta de EoS lo hará...

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 su condición previa 'Sin bucle'.

Creo que hacer algunos como este.

void printchar(char c, int n){
     int i;
     for(i=0;i<n;i++)
         print("%c",c);
}

printchar("*",10);