是否有任何setfill()替代C?
在C ++中:
int main() { cout << setfill('#') << setw(10) << 5 << endl; return 0; }
输出:
#########5
是否有任何setfill()
替代C? 或者如何在C中执行此操作而无需手动创建字符串?
不,没有直接替代方案。
但是如果你有一个表现良好的snprintf
(一个行为符合C99标准的那个),这可以在不创建新字符串的情况下工作; 只创建2个临时int
#include 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 Standard的snprintf
和Windows _snprintf
之间的差异( 感谢您的链接,Ben ):
- prototype:
int snprintf(char *restrict buffer, size_t n, const char *restrict format, ...);
- prototype:
int _snprintf(char *buffer, size_t n, const char *format, ...);
-
snprintf
写入不超过(n-1)个字节和NUL -
_snprintf
写入的不超过(n)个字节,其中最后一个可能是NUL或其他字符 -
snprintf
返回格式所需的字符数(可以大于n
)或-1
,以防编码错误 - 如果字符串的
n
不大,则_snprintf
返回负值; 如果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 */
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);
每个人都想printf
两次printf
… printf
是最昂贵的function之一。
这里:
char buffer[18] = "##########"; puts(buffer + snprintf(buffer+strlen(buffer), 8, "%d", 5));
不是作为标准内置的
我可能sprintf()将数字转换为字符串并获取字符数,然后在打印字符串之前先输出正确数量的’#’。
假设一个1字节的字符,下面将使用C中的memset
来完成它。 它仍然会创建一个’字符串’,但我不确定你不希望它是多么手动。
int main(void) { char buf[MAX_LENGTH]; memset(buf, '#', 10); buf[10]='\0'; printf("%s5\n", buf); }
根据您想要实际使用它的内容,您可以动态创建缓冲区以获得适当的大小,并根据需要从辅助函数返回它。