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

8 minutos de lectura

avatar de usuario
Maestro

me gustaría hacer algo como printf("?", count, char) repetir un caracter 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.

  • ¿Cuántos tenías en mente?

    – WhozCraig

    4 de febrero de 2013 a las 0:28

  • No saber el conteo en tiempo de compilación no es un obstáculo para escribir un bucle.

    –Keith Thompson

    4 de febrero de 2013 a las 0:54

  • Su pregunta es razonablemente clara (y la verdadera respuesta es que no hay printf formato que hace lo que quieres), pero tus comentarios me dejan inseguro de lo que estás preguntando. Habla de una cadena de formato y argumentos que se pasan a su función. ¿Sobre qué función estás preguntando? Parece que hay cosas que no nos cuentas.

    –Keith Thompson

    23 mayo 2013 a las 14:55

  • Me temo que todavía no tengo una idea clara de lo que está tratando de hacer o (sin ofender a @synthesizerpatel) por qué aceptó la respuesta que dio, que no pretendía ser una solución seria.

    –Keith Thompson

    23 mayo 2013 a las 21:01

  • (Por casualidad volví a ver esto 4 años y medio después). Mi solución para usar un bucle simple funciona perfectamente bien para responder a la pregunta que hiciste. No veo cómo es importante enviar datos a través de una red o almacenarlos en un disco. Si algo de esto aún es importante, considere actualizar su pregunta o, mejor, publicar una nueva.

    –Keith Thompson

    29 de diciembre de 2017 a las 19:04

avatar de usuario
rep_movsd

Puedes utilizar la siguiente técnica:

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

Esto se imprimirá "====="

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

  • Es desafortunado que esta respuesta no tenga una calificación más alta considerando que no solo es correcta sino que funciona en varias plataformas. Probado en OSX, Linux y OpenBSD en C, así como en Perl (que envuelve C printf anywho)

    – sintetizador patel

    22 de mayo de 2013 a las 11:49


  • Gracias, recordé haber hecho esto hace 10 años, pero lo olvidé y luego lo redescubrí.

    – rep_movsd

    23 de mayo de 2013 a las 9:28

  • Aunque no es exactamente flexible. Si el ancho es mayor que la cadena en sí, no imprimirá más que la cadena (al menos no en mi experimento simple con gcc).

    – Mats Peterson

    23 de mayo de 2013 a las 9:56

  • Esto funciona mejor que la respuesta de sintetizadorpatel. Cuando probé el espacio en lugar de un cero y el ancho es cero, todavía se imprime un solo espacio. Este no.

    – negro

    12 mayo 2014 a las 10:13

  • ¡Buena atrapada! @rep_movsd

    –Juan Diego Godoy Robles

    22 de octubre de 2015 a las 10:12

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

Puede utilizar la forma %* de imprimir, que acepta un ancho variable. Y, si usa ‘0’ como su valor para imprimir, conjunto con el texto alineado a la derecha que está relleno con 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.

Algunas veces solo tienes que hacer cosas gravemente 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;
}

  • No recuerdo claramente lo que estaba pensando, pero en su código el límite superior es 4096. supongo que podrías malloc el búfer

    –Keith Thompson

    29 de enero de 2014 a las 20:48

  • Lo suficientemente justo. ¡Pelea de cuchillos == evitada!

    – sintetizador patel

    31 de enero de 2014 a las 11:14

  • Este estilo es peor que asignar directamente caracteres en un bucle.

    – liuyang1

    27 de noviembre de 2015 a las 11:03

  • Sí. Este método es terrible pero responde la pregunta de los OP.

    – sintetizador patel

    24 mayo 2016 a las 16:48

  • ¿Puede aclarar qué quiere decir con espectáculo de terror? Siento que está tratando de advertir sobre algo, pero no estoy seguro de qué… ¿solo está tratando de señalar el peligro de desbordamiento cuando usa “% *”?

    – Cheshirekow

    19 de julio de 2018 a las 18:17

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);

  • ¿Por qué una cadena vacía imprime espacios? no entiendo eso ¿No debería ser el último argumento " " en lugar de "" ?

    – n00b.exe

    17 de junio de 2021 a las 20:44

  • @ n00b.exe printf no actúa como un comando de repetición, actúa como un comando de formato. Imagínese tratando de alinear bien las columnas de texto con un ancho variable, por lo que desea rellenar todo a la izquierda. Así que es relleno izquierdo, una cadena en blanco.

    – Ariel

    18 de junio de 2021 a las 2:19

avatar de usuario
kristian gregersen

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ás que escribir un bucle usando printf o putso escriba una función que copie los tiempos de conteo de cadenas en una nueva cadena.

  • Es muy extraño que pueda tener las expresiones más complicadas, pero algo tan simple como repetir un carácter no se admite.

    – Maestro

    4 de febrero de 2013 a las 0:33

  • ¿Por qué? Puede hacerlo simplemente agregando un bucle alrededor de lo que desea repetir. La mayor parte de lo que hace printf son cosas que no podría hacer en su propio código [very easily]. Deje que las bibliotecas hagan la parte difícil y que el programa de aplicación haga la parte fácil, creo que ese es el tema aquí.

    – Mats Peterson

    4 de febrero de 2013 a las 0:38

  • Y si está convencido de ello, supongo que el comité de estándares de C está interesado en sugerencias para mejoras, y una implementación de muestra dentro de glibc quizás mejoraría las posibilidades de que alguna vez se convierta en estándar. Si lo implementas, tal vez alguien más piense que es una buena idea. Solo ha estado desaparecido durante los últimos 50 años desde que se introdujo printf por primera vez, por lo que quizás sea solo un descuido… 😉

    – Mats Peterson

    4 de febrero de 2013 a las 0:40

  • @MatsPetersson Esa no es una solución, porque no conozco la cadena de formato de antemano, vea mi respuesta a Mokammel.

    – Maestro

    4 de febrero de 2013 a las 0:40

  • ¿Por qué se está votando negativamente? Si está votando negativamente esta respuesta, hágame saber con qué no está satisfecho…

    – Mats Peterson

    23 de mayo de 2013 a las 9:53

avatar de usuario
keith thompson

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

  • Es muy extraño que pueda tener las expresiones más complicadas, pero algo tan simple como repetir un carácter no se admite.

    – Maestro

    4 de febrero de 2013 a las 0:33

  • ¿Por qué? Puede hacerlo simplemente agregando un bucle alrededor de lo que desea repetir. La mayor parte de lo que hace printf son cosas que no podría hacer en su propio código [very easily]. Deje que las bibliotecas hagan la parte difícil y que el programa de aplicación haga la parte fácil, creo que ese es el tema aquí.

    – Mats Peterson

    4 de febrero de 2013 a las 0:38

  • Y si está convencido de ello, supongo que el comité de estándares de C está interesado en sugerencias para mejoras, y una implementación de muestra dentro de glibc quizás mejoraría las posibilidades de que alguna vez se convierta en estándar. Si lo implementas, tal vez alguien más piense que es una buena idea. Solo ha estado desaparecido durante los últimos 50 años desde que se introdujo printf por primera vez, por lo que quizás sea solo un descuido… 😉

    – Mats Peterson

    4 de febrero de 2013 a las 0:40

  • @MatsPetersson Esa no es una solución, porque no conozco la cadena de formato de antemano, vea mi respuesta a Mokammel.

    – Maestro

    4 de febrero de 2013 a las 0:40

  • ¿Por qué se está votando negativamente? Si está votando negativamente esta respuesta, hágame saber con qué no está satisfecho…

    – Mats Peterson

    23 de mayo de 2013 a las 9:53

avatar de usuario
ramon

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'));

  • Yo sugeriría putchar('x') en lugar de printf("%c", 'x').

    – Paddu

    12 de agosto de 2014 a las 13:19

  • ¿Por qué? ¿El tiempo de ejecución es menor?

    – 71GA

    18 de febrero de 2020 a las 15:49

  • sí, menos gastos generales ya que no llamas a la función variádica printf. Sin embargo, la llamada de 10 veces para escribir es muy perjudicial para el rendimiento.

    – Antonin GAVREL

    13 de febrero de 2021 a las 6:13

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad