4

在 C++ 中:

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

    return 0;
}

输出:

#########5

C有什么setfill()替代品吗?或者如何在不手动创建字符串的情况下在 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 个临时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运行版本。


snprintfEDIT2:C99 标准和 Windows之间的差异_snprintf感谢您的链接,Ben):

  • 原型: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如果字符串不大,则返回负值;或者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 */
于 2010-10-05T21:38:06.933 回答
2

每个人都想调用printf两次......printf是最昂贵的功能之一。

这里:

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在 C 中使用 1 字节字符来执行此操作。它仍然会创建一个“字符串”,尽管我不确定您不希望它是多么手动。

int main(void)
{

   char buf[MAX_LENGTH];

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

根据您想要实际执行的操作,您可以动态创建缓冲区以使其具有适当的大小,并根据需要从辅助函数中返回它。

于 2010-10-05T21:07:32.883 回答