在C ++中:
int main()
{
cout << setfill('#') << setw(10) << 5 << endl;
return 0;
}
输出:
#########5
C有setfill()
替代品吗?或者如何在C中执行此操作而不手动创建字符串?
答案 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);
}
根据您想要实际使用它的内容,您可以动态创建适当大小的缓冲区,并根据需要从辅助函数返回。