92

printf("?", count, char)キャラクターを何度も繰り返すようなことをしたいのですがcount

これを実現するための正しいフォーマット文字列は何ですか?

編集:はい、ループで呼び出すことができることは明らかですが、それは私がprintf()避けたかったことです。

4

12 に答える 12

131

次の手法を使用できます。

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

これで印刷"=====" されます。VisualStudioで動作しますが、すべての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

そのような事はありません。printfまたはを使用してループを作成するか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));

基本的に、「\ 0」で埋められたスタックに10バイトを割り当て、最初の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 に答える