如何使用printf重复一个字符?
我想要做一些像printf("?", count, char)
重复一个字符count
次。
什么是正确的格式string来完成这个?
编辑:是的,很明显,我可以在循环中调用printf()
,但这正是我想要避免的。
简短的回答 – 是的,长的回答:不是你想要的。
你可以使用printf的%*forms,它接受一个可变的宽度。 而且,如果您使用“0”作为要打印的值, 并结合左侧填充零的右alignment文本。
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; }
您可以使用以下技术:
printf("%.*s", 5, "=================");
这将打印"====="
它适用于我在Visual Studio上,没有理由不适用于所有的C编译器。
在c ++中,你可以使用std :: string来获得重复的字符
printf("%s",std::string(count,char).c_str());
例如:
printf("%s",std::string(5,'a').c_str());
输出:
aaaaa
哪有这回事。 您必须使用printf
或puts
写一个循环,或者编写一个函数将string计数次数复制到一个新的string中。
如果你有一个支持alloca()函数的编译器,那么这是可能的解决scheme(虽然相当丑陋):
printf("%s", (char*)memset(memset(alloca(10), '\0', 10), 'x', 9));
它基本上在堆栈中分配了10个字节,这些字节用'\ 0'填充,然后前9个字节用'x'填充。
如果你有一个C99编译器,那么这可能是一个更好的解决scheme:
for (int i = 0; i < 10; i++, printf("%c", 'x'));
如果你限制自己重复0或者空格,你可以这样做:
对于空间:
printf("%*s", count, "");
对于零:
printf("%0*d", count, 0);
printf
不会这么做 – 而printf
对于打印单个字符来说是过分的。
char c = '*'; int count = 42; for (i = 0; i < count; i ++) { putchar(c); }
不要担心这是低效的; putchar()
缓冲它的输出,所以它不会为每个字符执行物理输出操作,除非需要。
你可以做一个这个工作并使用它的函数
#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; }
这将输出
#####
printf("%.*s\n",n,(char *) memset(buffer,c,n));
n
<= sizeof(buffer)
[也许n <2 ^ 16]
然而,优化器可能会改变它puts(buffer)
,然后缺乏EoS会…..
而且,memset是一个汇编指令(但它仍然是一个循环)。
严格看来,没有任何解决scheme给予你的先决条件“无循环”。
char buffer[31]; /*assuming you want to repeat the c character 30 times*/ memset(buffer,(int)'c',30); buffer[30]='\0'; printf("%s",buffer)
这不是一个通用的解决scheme,但是如果您需要打印指定数量的空白字符,则可以执行以下操作。
printf("%*.0i", count, 0);
我想这样做。
void printchar(char c, int n){ int i; for(i=0;i<n;i++) print("%c",c); } printchar("*",10);