gpt4 book ai didi

c - 访问 C 中列表中的结构成员

转载 作者:行者123 更新时间:2023-11-30 14:56:52 25 4
gpt4 key购买 nike

为了学习 C,我一直在 K&R 中完成练习,但遇到了一个奇怪的问题。我编写了一个程序来计算文件中的单词、字符和行数,然后绘制一个直方图来显示每个的计数。一切都运行良好,直到我尝试使用结构使我的代码更加可重用。我的结构如下:

struct category {
char *name;
int namelen;
int count;
};

它的值由构造函数分配:

struct category createCat(char *name) {
struct category cat = {name, get_width(name), 0};
return cat;
}

最后我有一个包含所有类别的列表,如下所示:

struct category catList[] = {words, lines, characters};

当我按名称访问这些结构的成员时,没有任何问题。但是,如果我尝试通过 catList[i].member 循环访问它们,则成员 count 始终返回 0。另外两个成员 name 和 namelen 的行为正确地使用循环,并且从循环外部访问 count 可以正确返回。如果有人愿意帮助我了解正在发生的事情,我将不胜感激。

如果有必要,这是我的完整程序:

#include <stdio.h>
#include <string.h>


int get_width(char* word) {
return 15 - strlen(word);
}

struct category {
char *name;
int namelen;
int count;
};

struct category createCat(char *name) {
struct category cat = {name, get_width(name), 0};
return cat;
}


int main () {
int c;
int inside_word;
int i;
int p;
struct category words = createCat("words");
struct category lines = createCat("lines");
struct category characters = createCat("characters");

struct category catList[] = {words, lines, characters};

while ((c = getchar()) != EOF) {
characters.count++;
if (c != '\n' && c != ' ' && c != '\t') {
putchar(c);
if (!inside_word) {
inside_word = 1;
words.count++;
}
}

else {
if (inside_word)
printf("\n");
inside_word = 0;
if (c == '\n')
lines.count++;
}
}
printf("\n%d words, %d lines, %d characters\n",
words.count, lines.count, characters.count);

for (i = 0; i < 3; i++) {
printf("%s:%*s", catList[i].name, catList[i].namelen, " ");
printf("%d", catList[i].count);
for ( p = 0; p < catList[p].count; p++)
printf("#");
printf("\n");

}
return 0;
}

最佳答案

当你这样做时:

struct category catList[] = {words, lines, characters};

您正在将 3 个结构体的数据复制catList 中。因此,当您按名称更新 3 个结构体时,catList 中的结构体是不同的副本,不会被更新。

为了解决这个问题,我建议使用指针类型。有两种方法可以做到这一点。

  1. 您可以在 createCat 方法中返回一个指针。

    struct category* createCat(char *name) {
    struct category* cat = (struct category*) malloc(sizeof(struct category));
    //...
    return cat;
    }

    从现在起,始终使用指针来存储。这是很常用的。

  2. 您可以将指针存储在数组catList中:

    struct category *catList[] = {&words, &lines, &characters};

    当你在循环中使用它们时,使用像:

    catList[i]->count++;

关于c - 访问 C 中列表中的结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44348402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com