为什么我在 C 语言中得到这么大的数字?

Why am I getting this huge numbers in C?

提问人:Alan Hidalgo 提问时间:1/18/2018 最后编辑:YunnoschAlan Hidalgo 更新时间:1/18/2018 访问量:2185

问:

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

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

C 数组 Windows EOF

评论

6赞 François Andrieux 1/18/2018
在使用它之前,您没有初始化。arreglo
2赞 Slava 1/18/2018
在定义所有变量时初始化所有变量是一个好习惯。
3赞 Weather Vane 1/18/2018
题外话:请记住,数组应该从 到 进行索引。0ARRAY_SIZE - 1
2赞 tadman 1/18/2018
此代码上的缩进是残骸。这不仅有助于沟通流程,还有助于传达意图,并有助于避免丑陋、难以看到的错误。
2赞 Chris Turner 1/18/2018
是否包含生成该输出的相同版本的代码?包含的代码不可能打印出两个数字。

答:

1赞 Yunnosch 1/18/2018 #1

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

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

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

获得看似非常高的值的另一种方法是将多个数字并排打印,而不在两者之间分隔空格。
因此,我建议的格式字符串中的“ ”和“\n”非常相关。

评论

0赞 Yunnosch 1/18/2018
@chux 谢谢,我被一个七位数的代表诱骗进了懒惰的陷阱...... ;-)
0赞 Alan Hidalgo 1/18/2018
好的,我的代码现在可以工作了。我初始化了数组和所有变量。我还确保数组的索引从 1 到 ARRAY_SIZE-1。我从 1 开始索引数组,因为我认为已经输入了一个单词,因为我通常不会使用空格开始输入,但是我必须在更强大的版本中工作。
0赞 Alan Hidalgo 1/18/2018
我想发布添加更正的代码以获得您的反馈,但有一个限制。有没有人知道如何在没有 stackoverflow 的情况下做到这一点,假设我正在回答我自己的问题?
0赞 Yunnosch 1/18/2018
回答你自己的问题是可以的。它甚至可能会得到一个徽章。您可以展示您的最终解决方案,以造福他人。如果现有的答案都不接近,你可以接受你自己的答案。如果你基本上使用其中一个答案,并且只是稍微微调了一下,你可以考虑接受这个答案而不是你自己的答案。
1赞 Jutorres 1/18/2018 #2

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

如果仍有问题,请尝试:

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

在 while 循环之前,查看“arreglo”数组是初始化为 0 还是只是随机值。

6赞 chux - Reinstate Monica 1/18/2018 #3

至少这些问题。

  1. int arreglo[ARRAY_SIZE];在其元素递增之前未初始化。这是“为什么我得到这么大的数字”@ikegami的最可能原因

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

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

  4. 逻辑流不正确,“制作一个图表来指示每个单词中有多少个字母”。

  5. 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
}
0赞 VladP 1/18/2018 #4

问题是:“为什么我在 C 语言中得到这么大的数字?

答案是:你没有给Arreglo Array分配任何东西,而且由于你没有初始化它,你得到了一些内存中存在的随机值。相信我,我已经在调试器中运行了您的代码,我也强烈建议在编程时采用标准做法。

此外,这是未写入格式说明符的常见错误: printf(“%d”,arreglo[1],arreglo[2]);

看看使用 printf(“%d”,“%d”,arreglo[1],arreglo[2]) 是否能解决您的问题。

顺便说一句,K&R 的书很老了,而且是在没有其他 C 书的时代写的。有更好的方法来学习 C。