5

現在、可能な限り少ない文字数で 1 つの文字を繰り返そうとしています。例として、私は実際に一連のスペースを繰り返すためにこれに似たものを使用しています:

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

そして、スペースのように、Cで文字列を繰り返して出力するための同様の、またはさらに短い/異なる方法があるかどうか疑問に思っていました。

可能であれば、これに似たものが欲しいです:

printf("%*s",i,"_");

しかし、私の知る限り、それは私にとって理想的であっても不可能です。

明確にするために、これらの例では、引数 i は、文字を繰り返したい回数を表します。つまり、2 番目の例は出力する必要があります (私が言うなら、12):

____________

注意:必ずしも printf に関連するものである必要はありませんが、短くする必要があります。

基本的には、1文字を指定回数繰り返して出力したい。

編集:現在、31文字を許可するforループを使用していますが、上記と同様の方法を使用すると、プログラムの構造により、さらに7文字を削減できます。したがって、ループは実際には理想的ではありません。

4

3 に答える 3

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ます。

最後にもう 1 つ: の使用は、コンパイラ (つまり、高度に最適化されたアセンブリ コード) によって非常に効率的な方法で実装できるmemset独自のループを使用してできることよりもおそらく効率的です。memset

于 2013-02-22T09:42:42.677 に答える
1

iその後の値が必要ない場合は、次のいずれかを行います。

for(;i--;printf("x"));

また

while(i--)printf("x");

22文字でそれをしてください。後で必要iになり、予備の変数jが横たわっている場合、私が見つけた最短の using-a-loop は 25 文字を使用します。

for(j=i;j--;printf("x"));

私ができる最善の関数の使用は、関数に 28 文字 + 呼び出しごとに 5 文字です。

r(x){x&&printf("x")&r(--x);}
int main()
{
     int i=12;
     r(i);
}
于 2013-02-22T12:47:25.093 に答える
0

特定の文字に興味がある場合は、非常に汚いトリック

#include <stdio.h>

const char *very_long_single_char_string = "___________________________________";

int main()
{
    int i = 4;

    printf("%.*s",i, very_long_single_char_string);

}

結果:

____
于 2013-02-22T09:47:06.693 に答える