在 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;
}

编辑:运行版本位于 伊迪奥内.


编辑2:C99 标准之间的差异 snprintf 和窗户 _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 如果返回负值 n 对于字符串来说并不大;或者 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 */

其他提示

通用标签

将输出: 0000000005

现在,如果您真的想要'#'而不是'0',则必须在字符串中手动替换它们。

也许: 通用标签

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

这里: 通用标签

不是标准内置的

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

下面将在C中使用memset进行操作,并假定其为1字节字符。它仍然会创建一个“字符串”,尽管我不确定您不希望手动使用它的方式。 通用标签

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top