【发布时间】:2011-11-25 10:21:12
【问题描述】:
我想让一个数字的输出总是有 6 位数字
例如:
- 如果数字为 1,则输出应为 100000
- 如果数字为 23,则输出应为 230000
- 如果数字为 236,则输出应为 236000
如何使用printf/sprintf 做到这一点?
【问题讨论】:
我想让一个数字的输出总是有 6 位数字
例如:
如何使用printf/sprintf 做到这一点?
【问题讨论】:
您不能直接使用 printf 进行操作(至少以符合标准的方式),您需要事先更改您的号码。
【讨论】:
printf 及其变体可以将零填充到左侧,而不是右侧。 sprintf 数字,然后自己添加必要的零,或确保数字长度为 6 位:
while(num < 100000)
num *= 10;
(此代码假定数字不是负数,否则您会遇到麻烦)
【讨论】:
while ((num < 1000000) and (num > -1000000)),但更重要的是该数字必须是 32 位整数或更高,short 或 char 不能保存这些类型的值。
printf 将返回打印出来的字符数。这可以打印出剩余的零:
int num = 3; // init
int len = printf("%d", num);
for (int i = 0; i < 6-len; ++i)
printf("0");
您应该添加一些错误检查(例如,如果len 大于 6)。
使用sprintf,您可以在剩余的缓冲区上使用memset,这样会更容易。
【讨论】:
if (len >= 0 && len < 6) printf("000000" + len);
使用printf的返回值(如下for循环的第一行)
#include <stdio.h>
int main(void) {
int number, width = 6;
for (number = 1; number < 9999999; number *= 7) {
int digits = printf("%d", number);
if (digits < width) printf("%0*d", width-digits, 0);
puts("");
}
return 0;
}
查看在http://ideone.com/TolIv运行的代码
【讨论】:
正如 Luchian 所说,printf 不支持这种行为,这与更常见的反向(左)填充不同。
但是,您可以通过以下方式轻松生成请求的结果:
char *number_to_six_digit_string(char *resulting_array, int number)
{
int current_length = sprintf(resulting_array, "%d", number);
while (6 > current_length) {
resulting_array[current_length++] = '0';
}
resulting_array[current_length] = '\0';
return resulting_array;
}
然后你就可以打印结果了:
char my_number[7];
printf("my number is %s, other stuff\n", number_to_six_digit_string(my_number, 13));
【讨论】: