如何使用printf重复char?

时间:2013-02-04 00:23:52

标签: c printf

我想做printf("?", count, char)之类的事情来重复count次字符。

完成此任务的格式字符串是什么?

编辑:是的,显然我可以在循环中调用printf(),但这正是我想要避免的。

12 个答案:

答案 0 :(得分:94)

您可以使用以下技术:

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

这将打印"=====" 它适用于Visual Studio,没有理由它不适用于所有C编译器。

答案 1 :(得分:48)

简短回答 - 是的,答案很长:不是你想要的。

您可以使用printf的%*形式,它接受可变宽度。并且,如果您使用'0'作为要打印的值,组合与右边对齐的文本在左侧填充为零..

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

产生:

00000000000000000000

我的舌头紧紧地贴在我的脸颊上,我提供了这个小恐怖节目的代码片段。

有些时候你只需要做一些事情严重来记住为什么你在其余的时间里努力尝试。

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

答案 2 :(得分:15)

在c ++中,您可以使用std :: string来获取重复的字符

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

例如:

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

输出:

aaaaa

答案 3 :(得分:15)

如果您仅限于重复0或空格,则可以执行以下操作:

对于空格:

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

对于零:

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

答案 4 :(得分:12)

没有这样的事情。您必须使用printfputs编写循环,或编写将字符串计数次数复制到新字符串中的函数。

答案 5 :(得分:6)

printf不会这样做 - 而printf对于打印单个字符来说是过度的。

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

不要担心这种效率低下; putchar()缓冲其输出,因此除非需要,否则不会对每个字符执行物理输出操作。

答案 6 :(得分:6)

如果你有一个支持alloca()函数的编译器,那么这是可能的解决方案(虽然很难看):

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

它基本上在堆栈上分配10个字节,用'\ 0'填充,然后前9个字节用'x'填充。

如果您有C99编译器,那么这可能是一个更简洁的解决方案:

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

答案 7 :(得分:3)

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

答案 8 :(得分:2)

你可以创建一个完成这项工作并使用它的功能

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

这将输出

#####

答案 9 :(得分:1)

printf("%.*s\n",n,(char *) memset(buffer,c,n));

n&lt; = sizeof(buffer) [也许n&lt; 2 ^ 16]

然而,优化器可能会将其更改为puts(buffer),然后缺少EoS .....

并且假设memset是一个汇编指令(但它仍然是一个循环 芯片)。

严格看待没有给出前提条件的解决方案&#39;没有循环&#39;。

答案 10 :(得分:0)

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

答案 11 :(得分:-1)

我觉得做这样的事情。

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

printchar("*",10);