C printf不会打印双类型数组值

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

注意:

您应该使用以下说明符来打印数组,而不是%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 {
    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