为什么我不对s字符串初始化成‘\0'这个程序就不能正常运行?初始化过后程序反而能正确输出了。
程序目标:
输入一个长度不大于1024的字符串,统计各个小写字母出现次数,然后按字母出现次数的多少从大到小排序,如果次数相同,按字母表输出,没出现的字母不输出。
例如输入:5b3a+4-hdeh5dh?
输出为:
h 3
d 2
a 1
b 1
e 1
#include
int main()
{
char s[1024]={'\0'},a[26],d[26],k='a'-1;
int i=0,j,c[26]= {0},sum=0;
scanf("%s",s);
for(j=0; j<26; j++) {
a[j]=(k+=1);
}
for(j=0; j<26; j++)
{
for(i=0; i<1024; i++)
{
if(s[i]==a[j])
sum++;
}
c[j]=sum;
d[j]=a[j];
sum=0;
}
for(j=0; j<26; j++) {
for(i=0; i<26-1-j; i++) {
if(c[i]sum=c[i];
c[i]=c[i+1];
c[i+1]=sum;
k=d[i];
d[i]=d[i+1];
d[i+1]=k;
}
}
}
for(i=0; i<26; i++)
{
if(c[i]>0) {
printf("%c\t%d",d[i],c[i]);
printf("\n");
}
}
}
你在1024大小的字符串数组中放入x个字符,当遍历到第x+1个时发现是'\0',结束。如果不初始化,第x+1个到最后的1024-x个都是不确定的(被分配给数组的未初始化内存里遗留着上次使用这个内存的程序设置的值),,里面或许就有小写字母。
你应该初始化,然后把里层循环的控制语句改为c[i]!='\0'。
因为s数组大小为1024,而你赋值时并没有完全赋值,后面的值是未知的,可以把后面循环条件i<1024改为str[i]!='\0'