在C语言中的频率函数

5
我编写了一个程序,应该接收一个字符串和一个字母作为参数,然后调用一个带有两个参数的函数(即该字符串和字母),并计算字符串中该字母的频率。
但我的代码存在问题,因为对于任何字母它总是返回值为零的num
#include <stdio.h>
#include <stdlib.h>

int Occur(char [], char);

int main()
{
    char s[100], l;
    printf("Enter A String:\n");
    scanf("%s",s);
    printf("Enter A Letter:\n");
    scanf("%c",&l);
    getchar();

    printf("Num Of Occurance is %d ",Occur(s,l));

    return 0;
}

int Occur(char S[100], char L)
{
    int i;
    int num=0;

    for(i=0; S[i]!='\0'; i++)
    {
        if(S[i]==L)
        num++;
    }

    return num;
}

2
你尝试过调试你的代码吗? - CIsForCookies
5
您的问题不在于计数函数,而在于如何读取输入。%s扫描一个单词,%c 扫描下一个字符,很可能是空格或换行符。您可以通过在 %c 前加一个空格来跳过空白符:scanf(" %c",&l); - M Oehm
(注意:在消息中包含字符计数可能是一个好主意。这将指向您的问题。) - M Oehm
@MOehm 你说得对..非常出色的解释。 - Ibrahim Yamani
4个回答

5
首先,您应该尝试调试代码。如果您这样做了,您会发现您认为L保留的字母并不是实际保留的字母。
其次,您的问题很简单,L没有获取您输入的字母,因为之前字符串中的回车符卡在scanf缓冲区中...使用“ scanf (" %c")”[前面有空格]来解决。
正如其他答案中提到的那样,还有其他解决方案,比如不推荐使用fflush()。一个不被认为有害的替代方法是在scanf("%s")和scanf("%c")之间使用getchar()。这将给您与使用scanf(" %c")相同的效果。
所有这些方法都能够工作的原因是它们都消耗了缓冲区中最后一个字符(在您的情况下是\n),从而允许%c消耗您实际想读取的字符。

3
问题的原因:
在这里,%c会获取scanf("%s",s)中的回车键。
因此,主要有两个解决方案:
解法1 => 请在%c之前使用空格:scanf(" %c", &l)
解法2 => 使用fflush(stdin),清除输入缓冲区的输出。
int main()
{

char s[100],l;
printf("Enter A String:\n");
scanf("%s",s);
printf("Enter A Letter:\n");
fflush(stdin);                       //here fflush(stdin) used to flushes the output buffer.
scanf("%c",&l);
l = getchar();
......
......
}

注意: 因为fflush(stdin)的行为未定义,所以始终优先使用解决方案1,而不是使用fflush()。 :)


1
关于 fflush,请看这里:https://dev59.com/5HA85IYBdhLWcg3wBOzh - CIsForCookies

0

你的函数定义在良好的代码实践方面存在问题。

与其使用

int Occur(char S[100], char L)

你应该这样写

int Occur(char S[] , char L)

否则,您的代码将专门寻找不超过100个字符大小的字符串。

除此之外,正如Ilario Pierbattista所说,这是一个输入缓冲区问题。 在继续输入之前,需要清除stdin,因此在getchar()调用之前放置scanf的juggad会起作用。


那不正确。问题在于从输入中获取字符。函数的声明和定义是正确的。 - Fureeish
@CIsForCookies,你提到的帖子讨论的是函数原型而不是定义。 - Dipunj

0
这是一个输入缓冲问题。字符被getchar读取,而不是scanf。 执行l = getchar()可以解决该问题(在此之前调用scanf会清除输入缓冲区)。
#include <stdio.h>
#include <stdlib.h>

int Occur(char [],char);


int main()
{

char s[100],l;
printf("Enter A String:\n");
scanf("%s",s);
printf("Enter A Letter:\n");
scanf("%c",&l);
l = getchar();

printf("Num Of Occurance is %d ",Occur(s,l));


return 0;
}


int Occur(char S[100],char L){

int i;
int num=0;

for(i=0;S[i]!='\0';i++){

if(S[i]==L)
    num++;
}

return num;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接