我正在尝试使用克尼根(Kernighan)的书自学C,并且我应该制作一个图表来指示每个单词中有多少个字母。我还没有进入“绘图”部分,因为我在输出中确实变得很奇怪而且数量很多。现在,我只是想打印数组“arreglo”的第一个和第二个元素的值。

代码如下:

#include <stdio.h>
#define ARRAY_SIZE 100

/*#define AUX 0
#define AUX2 0*/

main()
{
    int s,j,noletra,i,arreglo[ARRAY_SIZE],otros, nopalabra, c;
    int a;
nopalabra=1;

    while((c=getchar())!=EOF)
{
        if(c==' '||c=='\t'||c=='\n')
               ++nopalabra;
        else
               ++arreglo[nopalabra];
        }
        printf("%d",arreglo[1],arreglo[2]);

}

我试图知道数组第二个元素中的值的原因是第一个元素具有正确的值。假定该代码在数组索引中加1,即每次键入空格,制表符或\n时的单词数,并且每当键入与前面提到的字符不同的内容时,就在数组元素中加1(字母)。现在应该可以正确打印两个单词的字母数,第一个元素可以正确打印,但是第二个元素是一个很大的数字,输出为:
    alan amaury
^Z
4 8257542
--------------------------------
Process exited after 7.773 seconds with return value 9
Press any key to continue . . .

输出应该是47。我在Windows中使用编译器,因此EOF应该为Ctrl + Z

我能从您那里得到的任何帮助将不胜感激:)

最佳答案

至少这些问题。

  • int arreglo[ARRAY_SIZE];在其元素递增之前未初始化。这是“为什么我会收到这么大数目”的最可能原因@ikegami
     // int arreglo[ARRAY_SIZE];
     // replace with
     int arreglo[ARRAY_SIZE] = { 0 };
    
  • 代码可以访问数组范围之外,因为nopalabra不限于0到99。
    #define ARRAY_SIZE 100
    int arreglo[ARRAY_SIZE];
    ++arreglo[nopalabra];  // No access protection
    
  • printf("%d",arreglo[1],arreglo[2]);仅打印arreglo[1]
  • 逻辑流程不正确,无法“创建一个图表来指示每个单词中有多少个字母”。
  • main()返回类型未编码。


  • 一些伪代码作为替代
    int main(void) {
      set all arreglo[] to 0
      int nopalabra = 0;
      part_of_word = false;  // Keep track of word state
      loop forever {
        get a character into c
        if c is a separator or EOF
          if (part_of_word) {
            arreglo[nopalabra]++;
            part_of_word = false;
          nopalabra = 0;
          if (c == EOF) break loop
        } else {
          nopalabra++;
          part_of_word = true;
        }
      }
    
      print out results
    }
    

    关于c - 为什么我在C语言中得到如此巨大的数字?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48306269/

    10-12 16:11