如何在C中漂亮打印数组

所以我有这个问题,我将打印数组。
输出应该是这样的:

{element0,element1,element2}

所以我写了这个:

#include "stdio.h" main() { int a[10] = {1, 0, 3, 10, 20, 0, 7, 8, 15, 14}; int i; for (i = 0; i < 10; i++) { printf("{%d, }", a[10]); } } 

好吧,我怎么能在世界上写出一行中的所有数字,它们应该在大括号之间,用逗号分隔。 我假设你应该使用一些指向所有数字的指针。 但我是新手,从来没有学过这个,而且相当棘手……

是的,但我认为我应该使用指针,如果我没有弄错。

分析

逐行解析问题中的代码。

 #include "stdio.h" 

标准使用#include ; 你最好了解C,在你使用其他任何东西之前不需要问这个问题。

 main() 

自1999年以来,这一直不是合法的标准C(对于所有C编译器仍然接受它而没有抱怨)。 您应该始终声明返回类型。 我使用int main(void)因为我没有从我的默认编译器选项中获取错误,但你可以使用int main()

 { int a[10]= {1, 0, 3, 10, 20, 0, 7, 8, 15, 14}; int i; 

虽然上面的代码没问题,但是C99编译器允许你写入for (int i = 0; i < 10; i++)并在循环之前省略i的定义。

  for (i=0; i<10; i++) { printf("{%d, }", a[10]); } 

正如其他人所指出的, a[10]是错误的。 这是错误的,因为它应该是a[i] ,并且因为a[10]超出了数组的末尾,所以你调用了未定义的行为。

 } 

您无法确保显示换行符,也不会向环境返回状态。 如果你编写C89代码,你应该return 0; 最后(但你可以逃脱main()的原始声明)。 如果你没有return 0; 最后使用C99标准给出的宽限,你必须在顶部有int main(void)或类似的东西。 你不可能同时拥有这两种方式。

合成

问题已更新,表明将使用指针,并且if (i != 0)可能不允许在循环体内。 在那种情况下,我可能会写:

 #include  int main(void) { int a[10] = { 1, 0, 3, 10, 20, 0, 7, 8, 15, 14 }; int *p = &a[0]; int *end = &a[10]; char *pad = "{ "; while (p < end) { printf("%s%d", pad, *p++); pad = ", "; } printf(" }\n"); return 0; } 

形成a[10]的地址并将指针与它进行比较是合法的,但取消引用它是不合法的(使用a[10] )。 代码在{}之后放置一个空格,因为这就是我喜欢的数据显示方式。 如果您不想要空间,请省略空格。 如果你在逗号后面没有空格,也省略它。 我发现'pad'技术非常有用,并且在这些场景中经常使用它。 您可以增强打印代码来处理必须在多行上拆分的更大数组(尽管使用数组索引比使用指针更容易),以及其他类似的变体。

样本输出:

 { 1, 0, 3, 10, 20, 0, 7, 8, 15, 14 } 

如果您有多行输出,您可能希望将数字很好地对齐。 在这种情况下,您必须使用转换规范(例如%2d才能使所有数字在2位宽的列中右对齐。

概括

更通用的解决方案是使用函数进行打印,更像是:

 #include  static void print_array(int *array, int size) { int *p = array; int *end = array + size; char *pad = "{ "; while (p < end) { printf("%s%d", pad, *p++); pad = ", "; } printf(" }\n"); } int main(void) { int a[10] = { 1, 0, 3, 10, 20, 0, 7, 8, 15, 14 }; print_array(a, 10); print_array(a, 5); return 0; } 

如果我理解你的问题,你可以这样做

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

输出是(预期的)

 {1, 0, 3, 10, 20, 0, 7, 8, 15, 14} 
 #include "stdio.h" main() { int[10] a= {1, 0, 3, 10, 20, 0, 7, 8, 15, 14}; printf("{"); for (int i = 0; i < 10; i++) { printf("%d", a[i]); if(i < 9) printf(","); } printf("}"); } 
 #include  int main(){ int a[10]= {1, 0, 3, 10, 20, 0, 7, 8, 15, 14}; int i; for (i=0; i<10; i++) { printf("%.*s%d%.*s%.*s", (!i), "{", a[i], 2*(i<9), ", ", (i==9)*2, "}\n"); } return 0; } 

这回答了你的字面问题,但它可能不是你的意思:

 printf ("{1, 0, 3, 10, 20, 0, 7, 8, 15, 14}\n"); 

考虑改变循环中的format

 #include "stdio.h" int main(void) { int a[10]= {1, 0, 3, 10, 20, 0, 7, 8, 15, 14}; size_t i; const char *format = "%d"; fputs("{", stdout); for (i=0; i<10; i++) { printf(format, a[i]); format = ", %d"; } fputs("}\n", stdout); return 0; } 

如果数组计数为1或甚至0,上述方法也可以正常工作。