cのsetfill()代替品はありますか?
-
28-09-2019 - |
質問
C ++で:
int main()
{
cout << setfill('#') << setw(10) << 5 << endl;
return 0;
}
出力:
#########5
何かありますか setfill()
Cの代替手段?または、文字列を手動で作成せずにCでこれを行う方法は?
解決
いいえ、直接的な選択肢はありません。
しかし、あなたがよく行われているなら snprintf
(C99標準で説明されているように振る舞うもの)、これは新しい文字列を作成せずに機能します。 2つの一時的なもののみを作成します int
s
#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.
edit2:C99標準の違い snprintf
と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
ifの場合は負の値を返しますn
文字列には大きくありません。またn
ヌルバイトがバッファーに書かれていない場合。
あなたは偽装を実行することができます _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 */
他のヒント
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);
誰もが電話したい printf
2回... printf
最も高価な機能の1つです。
ここ:
char buffer[18] = "##########";
puts(buffer + snprintf(buffer+strlen(buffer), 8, "%d", 5));
標準として組み込まれていません
私はおそらく、文字列に数値をsprintf()にsprintf()を取得し、文字列を印刷する前に最初に正しい数の「#」を出力します。
以下はそれを使用します memset
Cでは、1バイトのcharを想定しています。それはまだ「文字列」を作成しますが、あなたがそれをどれほど手動で望んでいないかはわかりません。
int main(void)
{
char buf[MAX_LENGTH];
memset(buf, '#', 10);
buf[10]='\0';
printf("%s5\n", buf);
}
実際に何をしたいのかに応じて、バッファを動的に作成して適切なサイズにして、必要に応じてヘルパー関数から返すことができます。
所属していません StackOverflow