这种printf格式是否可行(左对齐符号,零上没有符号)

时间:2017-09-18 20:56:23

标签: c string formatting printf string-formatting

我尝试使用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                                                                                                                              

有没有办法做到这一点,而不必做任何繁琐的字符串操作?

4 个答案:

答案 0 :(得分:6)

xml_attrs(xml_find_all(xx, "//Balance[@bsdate = '2014']/BalanceRows[@rowNum='200']"))
# [[1]]
#       type     rowNum valueStart   valueEnd 
#       "P"      "200"     "7500"     "8500

请注意上述printf("%c%3d\n", i>0 ? '+' : i<0 ? '-' : ' ', abs(i)); 失败,但这不应该成为一个问题,因为您的数值预计只会小于1000。

答案 1 :(得分:3)

简单的1个衬垫,与其他衬垫差别不大,但对"- +"字符串有很好的查找效果。

printf("%c%3d\n", "- +"[i >= 0 + i > 0], abs(i));

要处理[-999 ... + 999]范围之外的值,尤其是i = INT_MIN 未定义行为的讨厌的-i,代码可以使用:< / p>

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

答案 2 :(得分:0)

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);

    }

}

丑陋但是有效

答案 3 :(得分:0)

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);
}