C 语言有 setfill() 替代方案吗?
-
28-09-2019 - |
题
在 C++ 中:
int main()
{
cout << setfill('#') << setw(10) << 5 << endl;
return 0;
}
输出:
#########5
有没有 setfill()
C 的替代品?或者如何在 C 中执行此操作而无需手动创建字符串?
解决方案
不,没有直接的替代方案。
但如果你有一个良好的行为习惯 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;
}
编辑:运行版本位于 伊迪奥内.
编辑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字节字符。它仍然会创建一个“字符串”,尽管我不确定您不希望手动使用它的方式。
通用标签
根据您要实际使用的内容,可以动态创建适当大小的缓冲区,并根据需要从辅助函数中返回它。
不隶属于 StackOverflow