我想做一些类似printf("?", count, char)
重复字符count
时间的事情。
完成此操作的正确格式字符串是什么?
编辑:是的,很明显我可以printf()
循环调用,但这正是我想要避免的。
您可以使用以下技术:
printf("%.*s", 5, "=================");
这将在 Visual Studio 上打印"====="
It works for me,没有理由它不应该在所有 C 编译器上工作。
简短的回答 - 是的,很长的回答:不是你想要的。
您可以使用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;
}
如果您限制自己重复 0 或空格,您可以这样做:
对于空间:
printf("%*s", count, "");
对于零:
printf("%0*d", count, 0);
在 c++ 中,您可以使用 std::string 来获取重复字符
printf("%s",std::string(count,char).c_str());
例如:
printf("%s",std::string(5,'a').c_str());
输出:
aaaaa
哪有这回事。您必须使用printf
or编写一个循环puts
,或者编写一个将字符串计数次数复制到新字符串中的函数。
printf
不这样做 - 并且printf
对于打印单个字符来说太过分了。
char c = '*';
int count = 42;
for (i = 0; i < count; i ++) {
putchar(c);
}
不用担心效率低下;putchar()
缓冲其输出,因此除非需要,否则它不会对每个字符执行物理输出操作。
如果您有一个支持 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'));
#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)
}
你可以制作一个功能来完成这项工作并使用它
#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;
}
这将输出
#####
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)
[ 也可能是 n < 2^16]
但是,优化器可能会将其更改为puts(buffer)
,然后缺少 EoS 将......
并且假设 memset 是一个汇编指令(但在芯片上仍然是一个循环)。
严格来说,给定前提条件“无循环”,没有解决方案。
我认为做一些这样的。
void printchar(char c, int n){
int i;
for(i=0;i<n;i++)
print("%c",c);
}
printchar("*",10);