2d数组的空单元格的值是多少?

时间:2016-05-17 19:56:02

标签: c arrays string struct

我是c的新人,我正在努力解决问题。

我的问题是,我需要代替'/0',以便跳过它 “空”的细胞?

我知道我可以用简单的方法做到这一点,只是在条件下拥有所有.anoxi值,但我只是好奇。 我试过放"",它给了我所有的名字(不跳过任何一个),''给了我“ [错误]空字符常量”和 null ,这让我“ [错误]'null'未在此范围内声明

struct t { 
    char anoxi[10];
    char name[10];
    char gramma [2];
}

int main() {
    struct t array[5][12];
    int r;
    strcpy(array[4][1].anoxi, "+-1%");
    strcpy(array[4][2].anoxi, "+-2%");
    strcpy(array[4][5].anoxi, "+-0.5%");
    strcpy(array[4][6].anoxi, "+-0.25%");
    strcpy(array[4][7].anoxi, "+-1%");
    strcpy(array[4][8].anoxi, "+-0.05%");

    strcpy(array[0][0].gramma, "M");
    strcpy(array[0][1].gramma, "K");
    strcpy(array[0][2].gramma, "N");
    strcpy(array[0][3].gramma, "O");
    strcpy(array[0][4].gramma, "I");
    strcpy(array[0][5].gramma, "R");
    strcpy(array[0][6].gramma, "L");
    strcpy(array[0][7].gramma, "V");
    strcpy(array[0][8].gramma, "G");
    strcpy(array[0][9].gramma, "A");
    strcpy(array[0][10].gramma, "X");
    strcpy(array[0][11].gramma, "S");

    strcpy(array[1][0].name, "Black");
    strcpy(array[1][1].name, "Brown");
    strcpy(array[1][2].name, "Red");
    strcpy(array[1][3].name, "Orange");
    strcpy(array[1][4].name, "Yellow");
    strcpy(array[1][5].name, "Green");
    strcpy(array[1][6].name, "Blue");
    strcpy(array[1][7].name, "Purple");
    strcpy(array[1][8].name, "Grey");
    strcpy(array[1][9].name, "White");
    strcpy(array[1][10].name, "Gold");
    strcpy(array[1][11].name, "Silver");

    for (r=0; r<12; r++) {
        if (array[4][r].anoxi!= '\0') {
            printf("%s = %s\n",array[0][r].gramma, array[1][r].name);
        }
    }
    return(0);
}

3 个答案:

答案 0 :(得分:5)

C没有&#34;空&#34;的概念。 C中的变量代表实际的物理内存位置,它们包含内存所包含的内容,即它们被初始化为包含的内容,或者如果它们从未被初始化则包含一些随机值(请注意,static s默认初始化)

这并不妨碍您选择解释变量的一个可能值为&#34;空&#34;,但这将是您的选择,并且完全可以给你。然后,您必须使用该值初始化变量/数组并检查它。字符变量通常使用值'\0',这应该适合您 - 只需确保您处理单个字符和数组之间的区别:例如,... if...gramma[0] == '\0'' ...

你可能会认为这是一个例外:允许其中一个值指针变量是一个名为NULL的值,保证不指向任何东西。这通常用于初始化指针变量,但您仍需要进行初始化并自行检查。

答案 1 :(得分:3)

现在你得到了它,你可能想要阅读我的Structs (C),它提供了一个紧凑的例子,可能会派上用场 *

首先,请允许我质疑此代码的有效性。考虑我做的这个等效例子:

#include <stdio.h>

struct t { 
    char anoxi[10];
    char name[10];
    char gramma [2];
};

int main(void) {
        struct t my_array[5][1];
        if(my_array[0][0].anoxi != '\0')
                printf("%s\n", my_array[0][0].anoxi);
        return 0;
}

它将在我的机器中打印:

gsamaras@gsamaras-A15:~$ gcc -Wall px.c
gsamaras@gsamaras-A15:~$ ./a.out 
����

为什么?

因为,数组所拥有的内存没有被初始化到任何东西,所以它的值是未定义的,这会调用 UNDEFINED BEHAVIOR

我们可以通过初始化每个字符串来解决这个问题,如下所示:

    struct t my_array[5][1];
    my_array[0][0].anoxi[0] = '\0';
    if(my_array[0][0].anoxi[0] != '\0')
            printf("edw %s\n", my_array[0][0].anoxi);

或者,正如Mike建议的那样,您可以使用memset(),如下所示:

memset (my_array, 0, sizeof (my_array);

通常我们将变量的值设置为预定义的值,对于我们来说,人类告诉我们这个单元格/字符串/其他是空的。

知道这一点,除非我们告诉我们的计划要留意空的&#34;事情&#34;。我们必须告知我们的程序什么是空的&#34;&#34;特别是如何识别它!

在这里,你有一个字符串,你检查array[4][r].anoxi!= '\0'总是为真,因为左边是一个数组,它衰减到这个表达式中的指针,正如MM所说

* 我不在这里写,因为答案已经太长了

答案 2 :(得分:1)

首先,将数组初始化为空白:

struct t array[5][12] = { 0 };

这意味着您尚未分配内容的任何成员将具有值0(转换为该成员的类型)。这样,以后您可以通过检查成员是否仍然是0来查看该成员是否已被分配了其他内容。

然后你可以检查:

if ( array[4][r].anoxi[0] ) {
//                   ^^^^

请注意,您必须检查anoxi[0]哪个char对象。检查anoxi,它是一个数组对象,只检查数组是否存在于内存中(它在同义上是这样做的),而不是数组内容是否是某个特定值。

NB。 != '\0'是多余的,我认为省略它更清楚,但如果你愿意,可以使用它。