这种 printf 格式是否可行(左对齐符号和零符号)?
Is this printf format possible (left-justify sign and no sign on zero)?
我正在尝试使用 printf 获得以下编程输出:
- 20
- 15
- 10
- 5
0
+ 5
+ 10
+ 15
+ 20
主要规格是:
- 字段宽度始终为 4
- 符号始终左对齐
- 数字始终右对齐
- 零没有符号
到目前为止,我还没有想出能给我想要的结果的 printf 语句。我最接近的是:
for(int i = -20; i <= 20; i+=5)
{
printf("%-+4d \n", i);
}
产生:
-20
-15
-10
-5
+0
+5
+10
+15
+20
有没有办法做到这一点而无需进行任何繁琐的字符串操作?
printf("%c%3d\n", i>0 ? '+' : i<0 ? '-' : ' ', abs(i));
请注意,上述 INT_MIN
失败,但这应该不是问题,因为您的值预计只会小于 1000。
for(int i = -20; i <= 20; i += 5){
if(i == 0){
printf("%4d\n", i);
}
else{
(i > 0) ? printf("+%3d\n", i) : printf("-%3d\n", -i);
}
}
它很丑,但它有效。
for(int i = -20; i <= 20; i+=5) {
if( i < 0 )
printf("-%3d \n", -i);
else if(i == 0)
printf(" 0 \n");
else
printf("+%3d \n", i);
}
一个简单的单行代码,与其他代码没有太大区别,但可以很好地查找 "- +"
字符串。
printf("%c%3d\n", "- +"[i >= 0 + i > 0], abs(i));
处理 [-999 ... + 999] 范围之外的值,尤其是讨厌的 i = INT_MIN
,其中 -i
是 未定义的行为 ,代码可以使用:
printf("%c%3u\n", "- +"[i >= 0 + i > 0], (i < 0) ? 0u - i: 0u + i);
// or
printf("%c%3lld\n", "- +"[i >= 0 + i > 0], llabs(i));
迂腐的全系列解决方案
// Buffer size = iceil(bit-width * log2(10)) + sign + null character
#define INT_BUF_SIZE (CHAR_BIT * sizeof(int)*31/100 + 3)
int print_int(int x) {
char buf[INT_BUF_SIZE*2];
sprintf(buf, "%+d", x);
int width = 4;
return printf("%c%*s\n", x ? buf[0] : ' ', width - 1, buf + 1);
}
示例输出
- 20
0
+ 20
+2147483647
-2147483648
我正在尝试使用 printf 获得以下编程输出:
- 20
- 15
- 10
- 5
0
+ 5
+ 10
+ 15
+ 20
主要规格是:
- 字段宽度始终为 4
- 符号始终左对齐
- 数字始终右对齐
- 零没有符号
到目前为止,我还没有想出能给我想要的结果的 printf 语句。我最接近的是:
for(int i = -20; i <= 20; i+=5)
{
printf("%-+4d \n", i);
}
产生:
-20
-15
-10
-5
+0
+5
+10
+15
+20
有没有办法做到这一点而无需进行任何繁琐的字符串操作?
printf("%c%3d\n", i>0 ? '+' : i<0 ? '-' : ' ', abs(i));
请注意,上述 INT_MIN
失败,但这应该不是问题,因为您的值预计只会小于 1000。
for(int i = -20; i <= 20; i += 5){
if(i == 0){
printf("%4d\n", i);
}
else{
(i > 0) ? printf("+%3d\n", i) : printf("-%3d\n", -i);
}
}
它很丑,但它有效。
for(int i = -20; i <= 20; i+=5) {
if( i < 0 )
printf("-%3d \n", -i);
else if(i == 0)
printf(" 0 \n");
else
printf("+%3d \n", i);
}
一个简单的单行代码,与其他代码没有太大区别,但可以很好地查找 "- +"
字符串。
printf("%c%3d\n", "- +"[i >= 0 + i > 0], abs(i));
处理 [-999 ... + 999] 范围之外的值,尤其是讨厌的 i = INT_MIN
,其中 -i
是 未定义的行为 ,代码可以使用:
printf("%c%3u\n", "- +"[i >= 0 + i > 0], (i < 0) ? 0u - i: 0u + i);
// or
printf("%c%3lld\n", "- +"[i >= 0 + i > 0], llabs(i));
迂腐的全系列解决方案
// Buffer size = iceil(bit-width * log2(10)) + sign + null character
#define INT_BUF_SIZE (CHAR_BIT * sizeof(int)*31/100 + 3)
int print_int(int x) {
char buf[INT_BUF_SIZE*2];
sprintf(buf, "%+d", x);
int width = 4;
return printf("%c%*s\n", x ? buf[0] : ' ', width - 1, buf + 1);
}
示例输出
- 20
0
+ 20
+2147483647
-2147483648