所以我有这个问题,我将打印数组。
输出应该是这样的:
{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]);
}
}
好的,我怎么能在世界上写出一行中的所有数字,它们应该在大括号之间,用逗号分隔。我假设你应该使用一些指向所有数字的指针。但我是新手,从来没有学过这个,而且相当棘手......
是的,但我认为如果我没弄错的话,我应该使用指针。
答案 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,则上述方法也可以正常工作。