查找字符串中数字的频率(0-9)

时间:2018-10-16 18:34:52

标签: c

我在C语言中查找字符数组中数字频率的代码没有提供所需的输出。

int main() {
    int n;
    scanf("%d",&n);
    char str[n];
    int f[10],i,j,ns;
    gets(str);
    for(i=0;i<10;i++)
    {
        f[i]=0;
        for(j=0;j<strlen(str);j++)
        {
            ns=str[j]-'0';
            if(i==ns)
                f[i]+=1;
        }
    }
    for(i=0;i<10;i++)
        printf("%d ",f[i]);
    return 0;
}

如果我输入字符串

1wjhue73b38409598

我得到的频率为(0-9):

1 0 0 2 1 1 0 1 2 2 

代替“ 1”的频率1。 我要去哪里错了?

1 个答案:

答案 0 :(得分:5)

当您将scanfgets / fgets混合使用时,会发生这种情况。

打给scanf的电话正在等待一个号码。当您输入“ 1wjhue73b38409598”作为输入时,它将在字符串的开头读取1,并在看到“ w”时停止读取。因此n设置为1。

然后gets会立即读取其余字符(即“ wjhue73b38409598”),而不会提示。由于1不是该字符串的一部分,因此不会计数。

但是,还有另一个问题。因为n设置为1,所以str只能容纳1个字符。因此gets调用将写入缓冲区的末尾。这将调用undefined behavior。在这种特殊情况下,事情似乎可以正常工作,但是对代码的微小改动可能会改变未定义行为的表现方式。

即使您要为n输入适当的值(例如50),scanf调用也会在缓冲区中保留换行符。随后对gets的调用立即读取换行符并停止,因此所有计数器均为0。

请改用固定大小的缓冲区,并使用fgets(可以指定最大读取大小)来读取字符串:

char str[50];
fgets(str, sizeof(str), stdin);