我一直在K& R的练习中学习C,我遇到了一个奇怪的问题。我编写了一个程序来计算文件中的单词,字符和行,然后绘制一个直方图,显示每个文件的计数。一切都运行良好,直到我尝试使用结构使我的代码更可重用。我的结构如下:
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,正确地处理循环,并访问{{1}从循环外部返回正确。如果有人愿意帮助我了解正在发生的事情,我会非常感激。
如果有必要,这是我的完整计划:
count
答案 0 :(得分:1)
执行此操作时:
struct category catList[] = {words, lines, characters};
您将3个结构的数据复制到catList
。因此,当您按名称更新3个结构时,catList
中的结构将是不同的副本,并且不会更新。
要解决此问题,我建议使用指针类型。有两种方法可以做到这一点。
您可以使用createCat
方法返回指针。
struct category* createCat(char *name) {
struct category* cat = (struct category*) malloc(sizeof(struct category));
//...
return cat;
}
从此时起,始终使用指针进行存储。这是很常用的。
您可以将指针存储在数组catList
中:
struct category *catList[] = {&words, &lines, &characters};
当你在循环中使用它们时,请使用:
catList[i]->count++;
答案 1 :(得分:0)
您正在将if ((mode & S_ISTXT) == S_ISTXT)
结构复制到列表中。
但是在处理数据之前这样做,所以它们永远不会得到更新。
如果要维护这两组结构,则必须在循环中更新它们:
words, lines, characters
如果要维护单个设置,请删除另一个。 (几乎你现在拥有的,除了顶部和底部。)
如果您希望它们共享数据,则使用指针,因此列表(或独立变量)指向其他结构。