質問

C ++で:

int main()
{
    cout << setfill('#') << setw(10) << 5 << endl;

    return 0;
}

出力:

#########5

何かありますか setfill() Cの代替手段?または、文字列を手動で作成せずにCでこれを行う方法は?

役に立ちましたか?

解決

いいえ、直接的な選択肢はありません。

しかし、あなたがよく行われているなら snprintf (C99標準で説明されているように振る舞うもの)、これは新しい文字列を作成せずに機能します。 2つの一時的なもののみを作成します ints

#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);
}

実際に何をしたいのかに応じて、バッファを動的に作成して適切なサイズにして、必要に応じてヘルパー関数から返すことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top