我是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);
}
答案 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);
通常我们将变量的值设置为预定义的值,对于我们来说,人类告诉我们这个单元格/字符串/其他是空的。
c 不知道这一点,除非我们告诉我们的计划要留意空的&#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'
是多余的,我认为省略它更清楚,但如果你愿意,可以使用它。