c-处理字符串时出现分段错误



给定一个由字母和数字组成的字符串num,找出给定字符串中每个数字(0-9(的频率。

''

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include<ctype.h>
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
char num[20];
int i;
int count[15]={0};

scanf("%s",num);

for(i=0;i<10;i++){
printf("n");     
for(int j=0;j<strlen(num);j++){
if(isdigit(num[j])){
if(i == num[j]-'0'){
count[i]+=1;
}
}

}
printf("nCount %d:%d",i,count[i]);
}  
for(i=0;i<10;i++){
printf("%d ",count[i]);
} 
return 0;
}

''

输出:

计数0:5

计数1:9

计数2:5

计数3:12

计数4:8

计数5:11

计数6:15

计数7:4

计数8:4

退出,分段故障

为什么在检查数字是否为9时它不起作用?

查看输出时,您输入的字符串似乎比19个字符长得多。所以你的程序有未定义的行为。

这个

scanf("%s",num);

是你永远不应该做的事情。记住要将输入限制在缓冲区的大小。即:

char num[20];     // Size of buffer is 20
scanf("%19s",num);
^^
At max allow 19 characters so that there is also room for the string termination

或者——也许更好——使用fgets而不是scanffgets的一个好处是它将缓冲区大小作为参数,因此您永远不会忘记指定它

还要注意,外部for循环是不必要的。您可以使用单个循环直接更新数组。

// for(i=0;i<10;i++){  Delete this - it's not needed
for(int j=0;j<strlen(num);j++)
{
if(isdigit(num[j]))
{
count[num[j]-'0']+=1;  // Update array
}
}

BTW:你只需要10个元素在计数器中,即

int count[15]={0};   --->  int count[10]={0};

相关内容

  • 没有找到相关文章

最新更新