我正在实现程序来计算字母数字字符串中的数字频率,但是在花费数小时的奇怪输出之后,我能够找到C将垃圾值设置为所有索引值的解决方案。但令我感到惊讶的是,编译器将某些值设置为零(在我的示例中,它为0
索引设置0 to 7
,并在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
从调试器我得到这个快照: debugger snap shot
输出
0
1
1
0
0
2
1
0
1606415986
32769
为什么编译器设置垃圾值0
来自索引0 to 7
和1606415986
索引8
和32769
索引9
。
任何有助于我深入理解的帮助或链接都将受到赞赏。
我是初学者和学生所以请不要投票我的问题。 感谢
答案 0 :(得分:4)
int ar[10];
不会将元素初始化为0. ar
未初始化。
ar[]
元素的值是不确定的。 @haccks
编译器可能将它们设置为0,可能将它们设置为“垃圾”,如果访问则停止代码并且它包含陷阱值,或许多其他可能性。最可能的情况是值是内存中发生的任何值。
关键是良好的代码应该先读取它们或分配它们,然后再阅读它们。
// char s[MAX_LENGTH];
char s[MAX_LENGTH] = { 0 };
答案 1 :(得分:2)
虽然在C中初始化数组不是必须的,但是根本不应该使用未初始化的值。代码中的数组ar
具有自动存储功能,因此未初始化。由于您的代码依赖于初始值为零的事实,因此必须使用int ar[10] = { 0 };
请注意,如果此数组被定义为全局变量,则它将初始化为0
,但如果您使用malloc()
分配它,则它将是未初始化的。始终初始化变量并不会有什么坏处。
另请注意,您应测试scanf()
的返回值,并将要存储的最大字符数传递到目标数组中:
if (scanf("%999s", s) != 1) {
printf("input error\n");
return 1;
}
答案 2 :(得分:1)
如果您希望它们具有可预测的初始值,那么是。
int ary[10] = {0};
将它们全部初始化为零