是否有任何setfill()替代C?

时间:2010-10-05 20:53:26

标签: c++ c output-formatting

在C ++中:

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

    return 0;
}

输出:

#########5

C有setfill()替代品吗?或者如何在C中执行此操作而不手动创建字符串?

5 个答案:

答案 0 :(得分: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); 

答案 1 :(得分:3)

不,没有直接替代方案。

但是如果你有一个表现良好的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之间的差异(感谢您提供链接,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以防编码错误
  • 如果字符串_snprintf不大,则
  • n会返回负值;如果尚未将NUL字节写入缓冲区,则为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 */

答案 2 :(得分:2)

每个人都希望两次致电printf ... printf是最昂贵的功能之一。

下面:

char buffer[18] = "##########";
puts(buffer + snprintf(buffer+strlen(buffer), 8, "%d", 5));

答案 3 :(得分:1)

不是标准内置的

我可能会将数字sprintf()转换为字符串并获取字符数,然后在打印字符串之前先输出正确的“#”数。

答案 4 :(得分:0)

以下将使用C中的memset来假设一个1字节的字符。它仍会创建一个“字符串”,但我不确定你不希望它是多么手动。

int main(void)
{

   char buf[MAX_LENGTH];

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

根据您想要实际使用它的内容,您可以动态创建适当大小的缓冲区,并根据需要从辅助函数返回。