C++ の場合:
int main()
{
cout << setfill('#') << setw(10) << 5 << endl;
return 0;
}
出力:
#########5
setfill()
Cに代わるものはありますか?または、文字列を手動で作成せずに C でこれを行う方法は?
C++ の場合:
int main()
{
cout << setfill('#') << setw(10) << 5 << endl;
return 0;
}
出力:
#########5
setfill()
Cに代わるものはありますか?または、文字列を手動で作成せずに C でこれを行う方法は?
int x= 5;
printf("%010d",x);
出力されます: 0000000005
「0」の代わりに「#」が本当に必要な場合は、文字列で手動で置き換える必要があります。
多分 :
char buf[11], *sp = buf;
snprintf(buf, 11, "%10d", x);
while( (sp = strchr(sp, ' ')) != '\0'){ *sp = '#'; }
puts(buf);
いいえ、直接の代替手段はありません。
しかし、行儀の良いsnprintf
(C99 標準で説明されているように動作する) 場合、これは新しい文字列を作成しなくても機能します。一時的な を 2 つだけ作成int
する
#include <stdio.h>
int main(void) {
int filler = '#'; /* setfill('#') */
int width = 10; /* setw(10) */
int target = 5; /* 5 */
/* ******** */
int s = snprintf(NULL, 0, "%d", target);
for (int i = 0; i < width - s; i++) {
putchar(filler);
}
printf("%d\n", target);
/* ******** */
return 0;
}
編集: ideoneでバージョンを実行しています。
snprintf
EDIT2:C99標準とWindowsの違い_snprintf
(リンクありがとう、ベン):
int snprintf(char *restrict buffer, size_t n, const char *restrict format, ...);
int _snprintf(char *buffer, size_t n, const char *format, ...);
snprintf
(n-1) バイト以下と NUL を書き込みます_snprintf
(n) バイト以下を書き込みます。最後のバイトは NUL またはその他の文字である可能性がありますsnprintf
フォーマットに必要な文字数を返します (より大きくてもかまいませんn
)、または-1
エンコード エラーの場合は_snprintf
n
が文字列に対して大きくない場合は負の値を返します。またはn
NUL バイトがバッファに書き込まれていない場合。間違った動作_snprintf
をループで実行しn
、正しい値が見つかるまで増加させることができます
/* absolutely not tested, written directly on SO text editor */
int i;
size_t rightvalue = 0;
char buffer[SOME_DEFAULT_VALUE];
do {
if (sizeof buffer < rightvalue) /* OOPS, BIG BIG OOPS */;
i = _snprintf(buffer, rightvalue, "%d", 42);
} while (i != rightvalue++);
/* rightvalue already has space for the terminating NUL */
誰もが 2 回呼び出したいprintf
...printf
は、最も高価な関数の 1 つです。
ここ:
char buffer[18] = "##########";
puts(buffer + snprintf(buffer+strlen(buffer), 8, "%d", 5));
標準では搭載されていません
おそらく、数値を文字列に sprintf() して文字数を取得し、文字列を印刷する前に最初に正しい数の「#」を出力します。
以下はmemset
、1バイトのcharを想定してCで使用して実行します。それでも「文字列」を作成しますが、手動で作成したくない方法はわかりません。
int main(void)
{
char buf[MAX_LENGTH];
memset(buf, '#', 10);
buf[10]='\0';
printf("%s5\n", buf);
}
実際に何をしたいかによって、適切なサイズになるようにバッファーを動的に作成し、必要に応じてヘルパー関数から返すことができます。