C printf不会打印双类型数组值
注意: 您应该使用以下说明符来打印数组,而不是%d或%i: %e%e浮点或双指数格式 %f浮点或双符号十进制 %g%g浮动或根据需要重复使用%f或%e 您有8x8维的二维数组,因此在循环中使用N常量。 还可以选择数组元素以使用[i][j]打印它。 试试这个:C printf不会打印双类型数组值,c,arrays,struct,printf,double,C,Arrays,Struct,Printf,Double,注意: 您应该使用以下说明符来打印数组,而不是%d或%i: %e%e浮点或双指数格式 %f浮点或双符号十进制 %g%g浮动或根据需要重复使用%f或%e 您有8x8维的二维数组,因此在循环中使用N常量。 还可以选择数组元素以使用[i][j]打印它。 试试这个: #include <stdlib.h> #include <stdio.h> #include <math.h> #define N 8 typedef struct Array { doub
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define N 8
typedef struct Array {
double element[N][N];
} Array;
void PrintArray(Array a) {
int i;
int j;
for (i = 0; i < 64; i++) {
for (j = 0; j < 64; j++) {
printf("%d ", a.element);
}
} // for
} // PrintArray
int main(int argc, const char *argv[]) {
Array M = {
{ 174, 143, 143, 143, 143, 143, 143, 156,
192, 200, 156, 174, 174, 174, 156, 110,
254, 198, 174, 174, 200, 174, 143, 143,
239, 200, 156, 200, 200, 166, 143, 143,
200, 174, 156, 167, 166, 149, 156, 156,
128, 156, 143, 156, 174, 200, 198, 174,
143, 105, 110, 149, 156, 156, 200, 166,
110, 156, 143, 143, 143, 156, 174, 156 }
};
// need to implement PrintArray
PrintArray(M);
return EXIT_SUCCESS;
}
使用%d而不是%g表示双倍数字时的输出具有未定义的行为,因此它可能打印0或实数:
您有很多小事情,每一件都足以在程序中调用未定义的行为。对于初学者,您可以正确地声明常量define n8,但在遍历要打印的array-in-a-struct时忽略该常量,例如
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
注意:虽然不是一个错误,但C的标准编码样式避免使用camelCase或MixedCase变量名,而使用所有小写,同时保留大写名称以用于宏和常量
此外,在C中,您将希望传递指向结构的指针,而不是结构本身。这允许在每个函数调用上只传递一个_指针大小的信息,而不是传递整个结构本身的副本。因此,您的print_数组函数可以更恰当地写成:
void print_array (Array a)
{
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf (" %3g ", a.element[i][j]); /* note the use of i & j */
putchar ('\n');
}
}
您的编译器应该向您发出尖锐的警告——您需要阅读、理解和修复这些警告——并且在代码编译干净之前不要接受代码,而不要发出警告
struct foo的基本初始化是struct foo={…},其中{…}的内容可以使用命名的初始值设定项,或者为结构的某些或所有成员提供值。这里,您的结构或类型double[N][N]只有一个成员
要初始化2D数组,初始化类型为array[N][N]={{0…N-1},{1…N-1},{N-1…N-1};因此,您的array-in-a-struct需要3个大括号,例如array M={{{{0…N-1},{1…N-1},{…}
对结构及其包含的2D数组进行初始化将导致类似于以下内容的初始化:
Array Q50 = {{18, 11, 10, 18, 26, 40, 51, 61,
12, 12, 14, 19, 26, 58, 60, 55,
14, 13, 18, 26, 40, 57, 69, 56,
14, 17, 22, 29, 51, 87, 80, 62,
18, 22, 37, 56, 68,109,103, 77,
26, 35, 55, 64, 81,104,113, 92,
49, 64, 78, 87,103,121,120,101,
72, 92, 95, 98,112,100,103, 99}
};
总而言之,您可以执行以下类似操作:
Array M = {{{174, 143, 143, 143, 143, 143, 143, 156},
{192, 200, 156, 174, 174, 174, 156, 110},
{254, 198, 174, 174, 200, 174, 143, 143},
{239, 200, 156, 200, 200, 166, 143, 143},
{200, 174, 156, 167, 166, 149, 156, 156},
{128, 156, 143, 156, 174, 200, 198, 174},
{143, 105, 110, 149, 156, 156, 200, 166},
{110, 156, 143, 143, 143, 156, 174, 156}}};
请仔细阅读我关于启用编译器警告的评论,如果您还有其他问题,请告诉我。请参阅。您缺少清晰的问题描述,并且Q50未使用。请始终在启用警告的情况下编译,并且在代码编译干净且没有警告之前不要接受代码。要启用警告,请将-Wall-Wextra添加到gcc或clang编译字符串中。添加-pedantic以获得更多警告。对于叮当声,您可以使用-Weverything。对于windoze上的VS cl.exe,请添加/W3或使用/Wall,但您将收到许多与代码无关的额外警告。阅读并理解每个警告。他们将确定任何问题,以及出现问题的确切路线。通过听编译器告诉您的内容,您可以学到很多。谢谢。我觉得我已经检查了过去几天里我能找到的每一个迭代。我不知道%g,也没有在我的书中看到它。我确实尝试过%f和%1f,但它们没有循环通过,但我认为它们也是用于打印双精度的,我发现这是不正确的。我现在也将尝试实现其他功能。我可能会在几天后回来,我希望不会,但这对我有很大帮助。@JackD欢迎你。如果你能帮忙的话,你可以接受我的回答you@JackD%f、%g和%e都可用于以不同格式打印双精度打印。%1f表示最小字段宽度为1的%f,这是多余的%f将始终产生至少一个输出字符。%如果在printf中等于%f C99+,或者有未定义的行为C90,那么它几乎没有任何用处。@melpomene谢谢,我根据您的观点更正了我的答案,注意到向printf%d传递一个double有未定义的行为,所以不能保证您会看到0。答案相当广泛!我想补充一点,在C语言中,传递指向诸如数组之类的结构的指针,而不是通过值传递它们,这是惯用的做法,更倾向于使用void print_arrayconst Array*a的原型。如果您有进一步的问题,请告诉我。。。问:我怎样才能知道你所知道的东西,并且有着相似的知识深度:-+1。学习C不是你仅仅做的事情,它更像是一段旅程。学习它的方法就是好奇,总是问为什么代码是这样写的,或者为什么用puts而不是printf?等等。。一次找到一个答案。把你的头撞到墙中间。这真的可以归结为你一次吃一口鲸鱼的方式:@DavidC.Rankin:就像我说的,我是一个粉丝:--@DavidC.Rankin:我喜欢鲸鱼的比喻!当然,在C语言中,一次只能学习一个字节,有时甚至一次只能学习一位
void print_array (Array a)
{
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf (" %3g ", a.element[i][j]); /* note the use of i & j */
putchar ('\n');
}
}
void print_array (Array *a)
{
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf (" %3g ", a->element[i][j]); /* note the use of -> */
putchar ('\n');
}
}
Array Q50 = {{18, 11, 10, 18, 26, 40, 51, 61,
12, 12, 14, 19, 26, 58, 60, 55,
14, 13, 18, 26, 40, 57, 69, 56,
14, 17, 22, 29, 51, 87, 80, 62,
18, 22, 37, 56, 68,109,103, 77,
26, 35, 55, 64, 81,104,113, 92,
49, 64, 78, 87,103,121,120,101,
72, 92, 95, 98,112,100,103, 99}
};
Array M = {{{174, 143, 143, 143, 143, 143, 143, 156},
{192, 200, 156, 174, 174, 174, 156, 110},
{254, 198, 174, 174, 200, 174, 143, 143},
{239, 200, 156, 200, 200, 166, 143, 143},
{200, 174, 156, 167, 166, 149, 156, 156},
{128, 156, 143, 156, 174, 200, 198, 174},
{143, 105, 110, 149, 156, 156, 200, 166},
{110, 156, 143, 143, 143, 156, 174, 156}}};
#include <stdio.h>
#define N 8
typedef struct Array {
double element[N][N];
} Array;
void print_array (Array a)
{
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf (" %3g ", a.element[i][j]);
putchar ('\n');
}
}
Array Q50 = {{{18, 11, 10, 18, 26, 40, 51, 61},
{12, 12, 14, 19, 26, 58, 60, 55},
{14, 13, 18, 26, 40, 57, 69, 56},
{14, 17, 22, 29, 51, 87, 80, 62},
{18, 22, 37, 56, 68,109,103, 77},
{26, 35, 55, 64, 81,104,113, 92},
{49, 64, 78, 87,103,121,120,101},
{72, 92, 95, 98,112,100,103, 99}}};
int main (void)
{
Array M = {{{174, 143, 143, 143, 143, 143, 143, 156},
{192, 200, 156, 174, 174, 174, 156, 110},
{254, 198, 174, 174, 200, 174, 143, 143},
{239, 200, 156, 200, 200, 166, 143, 143},
{200, 174, 156, 167, 166, 149, 156, 156},
{128, 156, 143, 156, 174, 200, 198, 174},
{143, 105, 110, 149, 156, 156, 200, 166},
{110, 156, 143, 143, 143, 156, 174, 156}}};
puts ("\nprinting M\n");
print_array (M);
puts ("\nprinting Q50\n");
print_array (Q50);
return 0;
}
$ ./bin/structarrayq50
printing M
174 143 143 143 143 143 143 156
192 200 156 174 174 174 156 110
254 198 174 174 200 174 143 143
239 200 156 200 200 166 143 143
200 174 156 167 166 149 156 156
128 156 143 156 174 200 198 174
143 105 110 149 156 156 200 166
110 156 143 143 143 156 174 156
printing Q50
18 11 10 18 26 40 51 61
12 12 14 19 26 58 60 55
14 13 18 26 40 57 69 56
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
26 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99