printf("?", count, char)
キャラクターを何度も繰り返すようなことをしたいのですがcount
。
これを実現するための正しいフォーマット文字列は何ですか?
編集:はい、ループで呼び出すことができることは明らかですが、それは私がprintf()
避けたかったことです。
次の手法を使用できます。
printf("%.*s", 5, "=================");
これで印刷"====="
されます。VisualStudioで動作しますが、すべての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
またはを使用してループを作成するか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));
基本的に、「\ 0」で埋められたスタックに10バイトを割り当て、最初の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);