为什么我在C中获得这么大的数字?

时间:2018-01-17 16:56:53

标签: c arrays windows eof

我正在尝试使用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 . . .

输出应该是4 7.我在Windows中使用编译器,所以EOF应该是Ctrl + Z

我将从中获得任何帮助,我们将不胜感激:)

4 个答案:

答案 0 :(得分:5)

至少这些问题。

  1. int arreglo[ARRAY_SIZE];在元素递增之前未初始化。这是&#34;为什么我得到这么大的数字&#34; @ikegami

     // int arreglo[ARRAY_SIZE];
     // replace with 
     int arreglo[ARRAY_SIZE] = { 0 };
    
  2. 代码可以访问数组边界,因为nopalabra不限于0到99.

    #define ARRAY_SIZE 100
    int arreglo[ARRAY_SIZE];
    ++arreglo[nopalabra];  // No access protection
    
  3. printf("%d",arreglo[1],arreglo[2]);仅打印arreglo[1]

  4. 逻辑流程不正确&#34;制作一个图表,表明每个单词中有多少个字母。&#34;

  5. main()返回类型未编码。

  6. 一些伪代码作为替代

    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
    }
    

答案 1 :(得分:1)

侧面:
您对printf()的调用的参数多于格式字符串所涵盖的参数 因此,您应该将代码清理为类似于

的代码
printf("%d %d\n", arreglo[1], arreglo[2]);

关于奇怪的输出: 获得令人惊讶的值的一种方法是使用非初始化变量 在您的情况下,缺少初始化会影响数组arreglo 确保初始化它,以便所有计数都从一个有意义的值开始。

获得看似非常高的值的另一种方法是在彼此相邻的位置打印多个数字,而不会在其间分隔空白区域。
所以&#34; &#34;和&#34; \ n&#34;在我提出的格式字符串中非常相关。

答案 2 :(得分:1)

首先,尝试之前回答的解决方案,更改printf()调用。

如果仍有问题,请尝试:

     printf("%d %d \n",arreglo[1],arreglo[2]); 

在while循环之前,看看&#34; arreglo&#34;数组初始化为0或者只是随机值。

答案 3 :(得分:0)

问题是:&#34;为什么我在C中获得这么大的数字?&#34;

答案是:你没有为arreglo数组分配任何东西,并且由于你还没有初始化它,你得到了一些内存中的随机值。相信我,我已经在调试器中运行了你的代码,我也强烈推荐一个标准的做法,同时学习程序。

此外,这是一个常见错误,其中未写入格式说明符: 的printf(&#34;%d&#34;,arreglo [1],arreglo [2]);

查看是否使用printf(&#34;%d&#34;,&#34;%d&#34;,arreglo [1],arreglo [2])解决了您的问题。

顺便说一句,K&amp; R书很老,写的时候还没有其他C书。有更好的学习C的方法。