簡體   English   中英

這種 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。

一個簡單的單行,與其他行沒有太大區別,但可以很好地查找"- +"字符串。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM