如何在C中漂亮打印数组

时间:2014-07-05 19:22:17

标签: c arrays

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

  

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

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

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

6 个答案:

答案 0 :(得分:5)

分析

逐行扫描问题中的代码。

#include "stdio.h"

标准使用#include <stdio.h>;你更了解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 <stdio.h>

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 <stdio.h>

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

答案 1 :(得分:3)

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

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}

答案 2 :(得分:3)

#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("}");
}

答案 3 :(得分:2)

#include <stdio.h>

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

考虑改变循环中的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,则上述方法也可以正常工作。