我是C的初学者,目前正在使用Kernighan和Ritchie编写的C编程语言练习。这个特殊的练习是1.13,我正在尝试制作一个程序,根据输入的单词长度输出直方图。但是,在编译和运行这段代码时,在控制台中按Enter键后会收到以下错误:
非法指令:4
代码本身肯定是错误的和不完整的,但我只是想在这里测试它。问题是我无法弄清楚这个错误来自哪里。我正在使用Macbook并尝试在编译到gcc期间指定我的操作系统版本,但这没有帮助解决问题。
#define WORD 0
#define NONWORD 1
int main(void)
{
int c, i, j;
int state;
int incrementer;
/* This solution only works for word-lengths below 20 characters.
Can be expanded/decreased by resizing wordLengths-array to any given length. */
int wordLengths[20];
while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\t' || c == '\n'){
state = NONWORD;
} else {
state = WORD;
}
if (state == WORD) {
incrementer++;
}
if (state == NONWORD && incrementer != 0) {
wordLengths[incrementer-'1']++;
incrementer = 0;
}
}
for (i = 0; i < sizeof(wordLengths); i++) {
printf("%d |", i);
for (j = 0; j < wordLengths[i]; j++) {
putchar('=');
}
printf("\n");
}
printf("Hello world");
}
答案 0 :(得分:1)
调试器是你最好的朋友。您会立即意识到您的incrementer
不足以计算它所在的单词,或者用作数组的索引。
其中一种可能性是引入一个单独的变量来计算单词并将测量的长度写入数组的相应成员
int wcnt = -1;
以下列方式:
if (state == WORD) {
if(incrementer == 0)wcnt++;
incrementer++;
}
if (state == NONWORD && incrementer != 0) {
wordLengths[wcnt] = incrementer;
incrementer = 0;
}
并将其用于{{1}来自数组成员的书面大小:
printf()