我是c编程的初学者。我有一个程序来计算txt文件中的字母并将计数存储在一个数组中。当我在主函数中进行循环和计数时,一切正常
#define SIZE 26
#define UPPERCASEA 65
#define LOWERCASEA 97
#define SHIFTCASE 32 //difference between 'A'(int 65) and 'a'(int 97)
int main() {
int letter = 0;
int letters[SIZE] = {0};
printInstructions();
// loopAndCountLetters(letters);
letter = getchar();
// get rest of characters until EOF
while (letter != EOF) {
// if necessary change to uppercase
letter = changeToUpperCase(letter);
// increment proper letter in array
letters[letter - UPPERCASEA]++;
// get next letter
letter = getchar();
} // end of while
printLetterArray(letters, SIZE);
return 0;
}
但是,如果我使用相同的代码并尝试将其放入函数并将我的数组传递给该函数,我得到Bus Error (core dumped)
。功能如下:
主函数中的函数调用:
loopAndCountLetters(letters);
功能定义:
void loopAndCountLetters(int array[]) {
int letter = 0;
letter = getchar();
// get rest of characters until EOF
while (letter != EOF) {
// if necessary change to uppercase
if (letter >= LOWERCASEA) {
// shift value to uppercase
letter = letter - SHIFTCASE;
}
// increment letter in array
array[letter - UPPERCASEA]++;
letter = getchar();
} //end of while
return;
}
正常运作的句子示例:
这很正常。
即使这样有用吗?是的确如此。
这会导致错误
带冒号的任何内容:导致错误
答案 0 :(得分:2)
这是我的 猜测 ,并假设'A'
等于letter-UPPERCASEA
(或其等效的ASCII encoding)。< / p>
问题是,当您对几乎所有非实际字母的':'
执行操作时,您将获得否定索引,这将导致未定义的行为
让我们以冒号58
为例。它的ASCII值为'A'
。 65
的ASCII编码为array[letter-UPPERCASEA]++;
。所以当你这样做时
array[58-65]++;
它实际上和做
一样array[-7]++;
等于
main
您应该在数组中建立索引之前过滤掉任何非字母。
在您提出问题之前,似乎在reloadData
函数中工作。实际上它确实没有。