提问人:Alan Hidalgo 提问时间:1/18/2018 最后编辑:YunnoschAlan Hidalgo 更新时间:1/18/2018 访问量:2185
为什么我在 C 语言中得到这么大的数字?
Why am I getting this huge numbers in C?
问:
我正在尝试用 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
我能从你那里得到的任何帮助将不胜感激:)
答:
在侧面:
调用 to 的参数多于格式字符串所涵盖的参数。
因此,您应该将代码清理为类似于printf()
printf("%d %d\n", arreglo[1], arreglo[2]);
关于奇怪的输出:
获得令人惊讶的值的一种方法是使用非初始化的变量。
在您的情况下,缺少初始化会影响数组 。
确保初始化它,以便所有计数都从一个有意义的值开始。arreglo
获得看似非常高的值的另一种方法是将多个数字并排打印,而不在两者之间分隔空格。
因此,我建议的格式字符串中的“ ”和“\n”非常相关。
评论
首先,尝试之前回答的解决方案,更改 printf() 调用。
如果仍有问题,请尝试:
printf("%d %d \n",arreglo[1],arreglo[2]);
在 while 循环之前,查看“arreglo”数组是初始化为 0 还是只是随机值。
至少这些问题。
int arreglo[ARRAY_SIZE];
在其元素递增之前未初始化。这是“为什么我得到这么大的数字”@ikegami的最可能原因// int arreglo[ARRAY_SIZE]; // replace with int arreglo[ARRAY_SIZE] = { 0 };
代码可以访问数组边界之外,因为不限于 0 到 99。
nopalabra
#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 语言中得到这么大的数字?
答案是:你没有给Arreglo Array分配任何东西,而且由于你没有初始化它,你得到了一些内存中存在的随机值。相信我,我已经在调试器中运行了您的代码,我也强烈建议在编程时采用标准做法。
此外,这是未写入格式说明符的常见错误: printf(“%d”,arreglo[1],arreglo[2]);
看看使用 printf(“%d”,“%d”,arreglo[1],arreglo[2]) 是否能解决您的问题。
顺便说一句,K&R 的书很老了,而且是在没有其他 C 书的时代写的。有更好的方法来学习 C。
评论
arreglo
0
ARRAY_SIZE - 1