92

我想做一些类似printf("?", count, char)重复字符count时间的事情。

完成此操作的正确格式字符串是什么?

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

4

12 回答 12

131

您可以使用以下技术:

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

这将在 Visual Studio 上打印"=====" It works for me,没有理由它不应该在所有 C 编译器上工作。

于 2013-04-30T12:25:31.440 回答
68

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

您可以使用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;
}
于 2013-05-23T12:08:49.333 回答
31

如果您限制自己重复 0 或空格,您可以这样做:

对于空间:

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

对于零:

printf("%0*d", count, 0);
于 2015-08-11T06:46:46.050 回答
19

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

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

例如:

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

输出:

aaaaa
于 2013-05-15T05:21:22.733 回答
14

哪有这回事。您必须使用printfor编写一个循环puts,或者编写一个将字符串计数次数复制到新字符串中的函数。

于 2013-02-04T00:26:17.590 回答
9

printf不这样做 - 并且printf对于打印单个字符来说太过分了。

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

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

于 2013-02-04T00:53:38.860 回答
7

如果您有一个支持 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'));
于 2013-12-24T17:54:14.217 回答
4
#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)
}
于 2014-11-21T01:40:54.073 回答
3

你可以制作一个功能来完成这项工作并使用它

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

这将输出

#####
于 2015-09-18T12:53:15.207 回答
2
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 />
于 2018-02-27T22:27:04.320 回答
1
printf("%.*s\n",n,(char *) memset(buffer,c,n));

n<= sizeof(buffer)[ 也可能是 n < 2^16]

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

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

严格来说,给定前提条件“无循环”,没有解决方案。

于 2014-04-27T16:26:28.637 回答
-2

我认为做一些这样的。

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

printchar("*",10);
于 2013-02-04T00:50:52.790 回答