#include<stdio.h>
int fcount(char ch, char *a){
if(*a == '\n'){
printf("d");
return 0;
}
else
if(*a == ch){
printf("b");
return 1 + fcount(ch, a++);
}
else
if(*a!=ch){
return fcount(ch, a++);
}
}
int main(){
char *s;
int c = 0, i;
printf("Enter anything you wish\n");
scanf(" %[^\n]s",s);
for(i = 97; i <= 122; i++){
c = fcount(i, s);
if(c != 0)
printf("[%c] %d\n", i, c);
}
}
这是我计算给定文本行中每个字符频率的逻辑 但该程序似乎没有显示预期的输出
我得到的是:分段错误(Core dumped) 请给我一些建议!
答案 0 :(得分:1)
您在scanf
中传递的指针值未初始化。访问该垃圾值会调用未定义的行为。
分配一些内存,然后将其传递给scanf
。
您只需使用char s[10]
即可。或者你可以动态分配它。
s = malloc(sizeof(char)*10);
if( s == NULL){
fprintf(stderr,"%s"<"Error in malloc");
exit(1);
}
..
free(s);
答案 1 :(得分:0)
&#39; S&#39;是字符指针,它没有指向任何有效的内存。采用s [100]之类的静态数组或动态分配内存。
char *s;
用
替换上述语句char *s = malloc(n*sizeof(char)); // scan 'n' value from user.
一旦完成工作,使用free()函数释放动态分配的内存。
free(s);
答案 2 :(得分:0)
您还没有为s
分配内存。使用malloc。
char *s;
s=(char*)malloc(21*sizeof *s); // Suppose you want at the most 20 chars in s
if(NULL == s){
printf("Memory allocation failed\n");
exit(1); // Exiting with a non-zero exit status
}
//Also, instead of scanf use fgets
fgets(s,21,stdin); // Does some bounds checking.
s[strlen(s)-1]='\0'; // Getting rid of newline character at the end, so mallocing 21 makes sense