我正在实施程序来计算字母数字字符串中数字的频率,但是在花费了几个小时的奇怪输出之后,我能够找到C将垃圾值设置为所有索引值的解决方案。但令我惊讶的是编译器将一些值设置为零(在我的示例中,它为0 to 7
索引设置0
,并在8th
和9th
位置设置一些随机垃圾值(。尽管如此,在四处寻找并与同事讨论之后,我找不到任何解决方案。
在这里,我发布我的代码和输出。
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 1000
int main()
{
int ar[10];
char s[MAX_LENGTH];
scanf("%s",s);
for(int i = 0; i < strlen(s); i++){
int index = s[i] - 48;
if(index >= 0 && index <= 9){
ar[index] = ar[index] + 1;
}
}
for(int i = 0; i <= 9; i++){
printf("%d n", ar[i]);
}
}
输入 :as12556fsd889ad9
从调试器中,我得到了这个快照: 调试器快照
输出:
0
1
1
0
0
2
1
0
1606415986
32769
为什么编译器从索引0 to 7
设置垃圾值0
1606415986
,在索引8
设置垃圾值,在索引9
32769
。
任何帮助或链接,让我对此有深刻的理解,将不胜感激。
我是初学者和学生,所以请不要对我的问题投反对票。 谢谢
函数内部的int ar[10];
不会将元素初始化为 0。ar
未初始化。
ar[]
元素的值是不确定的。 @haccks
编译器可以将它们设置为 0,可以将它们设置为"垃圾",如果访问代码并且它包含陷阱值,或者许多其他可能性。 最有可能的情况是,这些值是内存中碰巧的任何值。
关键是好的代码应该在读取它们之前首先初始化或分配它们。
// char s[MAX_LENGTH];
char s[MAX_LENGTH] = { 0 };
虽然在C 中初始化数组不是强制性的,但根本不应该使用未初始化的值。 代码中的数组ar
具有自动存储,因此它是未初始化的。由于代码依赖于初始值为零的事实,因此必须使用int ar[10] = { 0 };
显式初始化它
请注意,如果这个数组被定义为全局变量,它将被初始化为0
,但如果你要用malloc()
分配它,它将是未初始化的。 始终初始化变量不会有什么坏处。
另请注意,您应该测试scanf()
的返回值,并将要存储的最大字符数传递到目标数组中:
if (scanf("%999s", s) != 1) {
printf("input errorn");
return 1;
}
如果您希望它们具有可预测的初始值,那么是的。
int ary[10] = {0};
将它们全部初始化为零