0

我在使用 C 中的列表时遇到了一些问题。

我做了这个结构:

typedef struct str {
char * str;
struct str * prox;
struct str * ant;
} cadena;

然后在主目录中,我以第一个指向 NULL 的指针开始列表。

cadena * lista = NULL;

然后我创建了一个函数,用户可以在其中向列表添加新元素(“str”成员中的字符串),并管理构建列表的指针。这似乎工作正常。我希望。

但是当我想打印一个节点的成员时,我正在尝试使用这样的东西,但它不起作用:

void showdata (cadena *lista) {
    int i=0;
    while (lista.str[i] != '\0')
    {
        printf("%c\n",str[i]);
        i++;
    }
}

我收到这些错误:

from line "while (lista.str[i] != '\0')"
.error: request for member ‘str’ in something not a structure or union 

(为什么它需要一个结构?我以为我正在访问那里的成员)

from line "printf("%c\n",str[i]);"     
.error: ‘str’ undeclared (first use in this function)

(不是用结构声明的吗?)

我肯定做错了什么,但我不明白哪种方法是访问 char 成员并打印它的正确方法。

先感谢您。

4

3 回答 3

1
lista.str[i]

应该

lista->str[i]

任何你有一个指向你使用的结构的指针的地方 -> not 。

于 2012-10-29T00:19:21.713 回答
1

尝试:

while (lista->str[i] != '\0')
    printf("%c\n",lista->str[i++]);
于 2012-10-29T00:20:45.160 回答
0

这是一个指针符号问题。C 可能会以这种方式令人困惑。

lista.str[i]

不起作用,因为 C 无法识别“。” 就像搬到一个领域一样。对于像我这样习惯于 C# 或其他 OOP 语言的人来说,这可能是个问题,您可以在其中使用“.”。修改对象的属性,例如

control.visibility = "False"

在 C 中,结构是基于指针的,所以你需要像 Keith 所说的那样使用 -> 。您指向内存中的某个位置,或者指向某个字段所在的结构中的“位置”。这么想,应该不会有太多问题。

C 还允许您使用“.”...但前提是您强烈键入引用。对你来说,这意味着去

(*lista).str[i]

这样您对 lista 实例的引用就被视为指向该结构的指针。

因此,在审查中,要么

lista->str[i]

或者

(*lista).str[i]

应该工作。

于 2012-10-29T00:49:32.777 回答