目前,我试图以尽可能少的字符重复单个字符。例如,我实际上使用类似的东西来重复一系列空格:
printf("%*s",i,"");
我想知道在C中是否有类似的,甚至更短/不同的方式来重复字符串并将其打印出来,就像空格一样。
如果可能,我想要类似的东西:
printf("%*s",i,"_");
然而,据我所知,这是不可能的,无论对我来说是多么理想。
为了澄清,在这些例子中,参数i表示我希望字符重复的次数,即第二个例子应该输出(如果我说的话,12):
____________
NB:它不一定是与printf有关的任何东西,但是,它确实必须很短。
基本上,我想重复一个指定次数的字符,然后输出它。
编辑:我目前正在使用for循环,它允许我31个字符,但是通过使用类似于上面的方法,由于程序的结构方式,我可以删除另外7个字符。所以循环并不是很理想。
答案 0 :(得分:2)
您可以使用memset
:
void * memset ( void * ptr, int value, size_t num );
// Fill block of memory
// Sets the first num bytes of the block of memory pointed by ptr to the specified value
// (interpreted as an unsigned char).
所以你会这样做,假设dest
是你的目的地字符串:
memset(dest, '_', 12);
编辑:这是一个非常“原始”的解决方案。它不会在字符串的末尾加上'\ 0',所以如果你希望你的字符串只包含重复的字符并以标准方式格式化,你也必须处理它。你当然必须处理这样一个事实,即12可能比分配给dest
的空间大。
最后一件事:使用memset
可能比使用自己的循环更有效,因为memset
可以由编译器以非常有效的方式实现(即,高度 - 优化的汇编代码)。
答案 1 :(得分:1)
如果您之后不需要值i
,请:
for(;i--;printf("x"));
或
while(i--)printf("x");
用22个字符做。如果之后确实需要i
,并且你有一个备用变量j
,我发现最短的使用循环使用了25个字符:
for(j=i;j--;printf("x"));
使用函数我能做的最好的是函数的28个字符+每个调用的5个字符:
r(x){x&&printf("x")&r(--x);}
int main()
{
int i=12;
r(i);
}
答案 2 :(得分:0)
如果你对一个特定的char感兴趣,那就是超级肮脏的技巧
#include <stdio.h>
const char *very_long_single_char_string = "___________________________________";
int main()
{
int i = 4;
printf("%.*s",i, very_long_single_char_string);
}
结果:
____