4

C++ の場合:

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

    return 0;
}

出力:

#########5

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

4

5 に答える 5

5
 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); 
于 2010-10-05T21:25:29.313 に答える
3

いいえ、直接の代替手段はありません。

しかし、行儀の良い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でバージョンを実行しています。


snprintfEDIT2: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エンコード エラーの場合は
  • _snprintfnが文字列に対して大きくない場合は負の値を返します。またはnNUL バイトがバッファに書き込まれていない場合。

間違った動作_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 */
于 2010-10-05T21:38:06.933 に答える
2

誰もが 2 回呼び出したいprintf...printfは、最も高価な関数の 1 つです。

ここ:

char buffer[18] = "##########";
puts(buffer + snprintf(buffer+strlen(buffer), 8, "%d", 5));
于 2010-10-06T01:45:36.553 に答える
1

標準では搭載されていません

おそらく、数値を文字列に sprintf() して文字数を取得し、文字列を印刷する前に最初に正しい数の「#」を出力します。

于 2010-10-05T21:06:39.347 に答える
0

以下はmemset、1バイトのcharを想定してCで使用して実行します。それでも「文字列」を作成しますが、手動で作成したくない方法はわかりません。

int main(void)
{

   char buf[MAX_LENGTH];

   memset(buf, '#', 10);
   buf[10]='\0';
   printf("%s5\n", buf);
}

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

于 2010-10-05T21:07:32.883 に答える