2010-10-14 21 views
3

我試過了搜索功能,但只發現了在逗號/空格分隔文件中的的問題。打印時在C中劃定值的最佳/常用做法

但是我的問題是,你通常如何處理這個問題。假設我有一個list/array/...值,如{1,2,3,4},並且想用分隔符打印它們。

最簡單的版本是這樣的:

#include <stdio.h> 

int main(void) 
{ 
    char list[] = {1, 2, 3, 4}; 
    unsigned int i; 

    for (i = 0; i < 4; ++i) 
    printf("%d, ", list[i]); 

    return 0; 
} 

這顯然會打印出 「1,2,3,4,」。我遇到的問題是最後的逗號和空格。

現在我可以這樣做:

#include <stdio.h> 

int main(void) 
{ 
    char list[] = {1, 2, 3, 4}; 
    unsigned int i; 

    for (i = 0; i < 4; ++i) 
    { 
     printf("%d", list[i]); 
     if (i < 3) 
      printf(", "); 
    } 

    return 0; 
} 

,但似乎喜歡這樣做的最好辦法是不。有人能指引我走向正確的方向嗎?由於

PS:不,我通常不硬編碼值
PPS:不,我不是要寫的.csv文件;)

+0

可能重複(http://stackoverflow.com/questions/3496982/printing-lists-with-commas-c) – 2013-10-17 03:54:29

回答

4

我用這個成語:

assert(n > 0); 
printf("%d", list[0]); 
for (i = 1; i < n; ++i) 
    printf(", %d", list[i]); 

其一個缺點是它不像n == 0那樣很好地縮放,就像一個簡單的循環。另外,您也可以與n的== 0添加保護:

if (n > 0) 
    printf("%d", list[0]); 
for (i = 1; i < n; ++i) 
    printf(", %d", list[i]); 
+0

謝謝,這看起來[打印用逗號C++列出]非常漂亮和整潔。 – melzer 2010-10-14 19:23:37

+0

另一個缺點是你必須複製循環的主體。 – jamesdlin 2010-10-14 19:58:18

+0

'assert(n> 0);'看起來不正確,這不是打印數組內容的必要條件。 – Arun 2010-10-14 20:20:29

0

使用米哈爾Trybus的版本或反向

for (i = 0; i < (n - 1); ++i) 
{ 
    printf("%d, ", list[i]); 
} 
printf("%d", list[n - 1]); 
+0

@Michal,尼斯趕上。非常感謝你。 – Himanshu 2010-10-14 18:27:34

+0

沒問題。我已經刪除了這條評論;) – 2010-10-14 18:50:21

11

我對這個標準的技術是:

const char *pad = ""; 
for (int i = 0; i < n; i++) 
{ 
    printf("%s%d", pad, list[i]); 
    pad = ", "; 
} 

有時, pad的初始值是一個空格,或冒號空格,或其他任何在上下文中的作用。

+0

很不尋常,我喜歡它。 +1 – 2010-10-14 18:51:51

+0

不尋常,但一個非常好的主意。但我想我會堅持使用Michal Trybus版本。 – melzer 2010-10-14 19:24:35

0
for (printf("%d",list[i=0]) ; i < n ; printf(", %d", list[++i])) ; 
+0

我想打個招呼,因爲這讓我想起了我的C講師。她喜歡沒有人能理解的代碼。不幸的是,一個接一個;( – 2010-10-14 19:22:37

2

我拿起這個格式給K & R2條件運算符:

for (i = 0; i < n; i++) 
    printf("%d%s", list[i], i+1 < n ? ", " : "\n"); 
+0

K&R2?提到第二版? – melzer 2010-10-15 09:22:21

+0

@melzer:是的,第二版「The C Programming Language」,前面帶有「ANSI C」標記。 :在5.10中使用它 – schot 2010-10-15 09:28:56

1

好甚至認爲已經有一個公認的答案,沒有人提出帶有明顯的一個合我的口味:

#include <stdio.h> 
int main(void) { 
    unsigned list[] = {1, 2, 3, 4}; 
    unsigned const n = 4; 
    if (n) for (unsigned i = 0; ; ++i) { 
     printf("%d", list[i]); 
     if (i >= n) break; 
     printf(", "); 
    } 
    printf("\n"); 
    return 0; 
} 
+0

這與OP提到的幾乎相同 – jamesdlin 2010-10-14 23:28:20

+0

@jamesdlin:我不知道你如何衡量「非常多」,但我們的想法是隻做一些比較另一方面,它避免了在MichałTrybus的解決方案中重複印刷號碼 – 2010-10-15 06:02:50

+0

哦,好點,我錯過了這個方面,如果列表可能是空的,你必須添加一個額外的檢查,但是。 – jamesdlin 2010-10-15 08:27:03

0

爲什麼不只是另一個版本,而我們在它。這就是我通常做的

for (i=0;i<n;++i) 
{ 
    if (i) printf(", "); 
    printf("%d",list[i]); 
}