我是一个完全的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");
}

最佳答案

调试器是你最好的朋友您会立即意识到,您的incrementer不足以计算它在哪个单词处,也不足以用作数组的索引。
其中一种可能是引入一个单独的变量来计算单词,并将测量的长度写入数组的相应成员

int wcnt = -1;

以如下方式:
        if (state == WORD) {
            if(incrementer == 0)wcnt++;
            incrementer++;
        }
        if (state == NONWORD && incrementer != 0) {
            wordLengths[wcnt] = incrementer;
            incrementer = 0;
        }

也可用于printf()从数组成员写入大小:
for (i = 0; i <= wcnt; i++){ … }

07-27 13:31