我一直在努力通過K & R中的練習來學習C,並且遇到了一個奇怪的問題。我編寫了一個程序來計算文件中的單詞,字符和行數,然後繪製一個顯示每個文件計數的直方圖。一切都運行良好,直到我試圖讓我的代碼更容易與結構重用。我的結構如下:訪問C列表中的結構成員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在循環中表現正確,並且從循環外部訪問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;
}
這似乎意義的,我,但是當我在第一個選項中設置了你描述的wat時,我會在循環之前的'printf(word-> count等)節中得到一個段錯誤。使用第二個選項時,代碼的行爲與我從副本打印時的行爲相同。謝謝! – EthanS
對不起,我只是想出了問題所在:我在嵌套for循環中錯誤地調用了catList [p]而不是catList [i]。標記你的答案是正確的,謝謝! – EthanS