首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >查找字符串中数字(0-9)的频率

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

Stack Overflow用户
提问于 2018-10-17 02:34:52
回答 1查看 382关注 0票数 0

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

代码语言:javascript
复制
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;
}

如果我输入字符串

代码语言:javascript
复制
1wjhue73b38409598

我正在获取(0-9)的频率输出:

代码语言:javascript
复制
1 0 0 2 1 1 0 1 2 2 

而不是“%1”的频率1。我哪里错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-17 02:48:02

这就是当您将scanfgets / fgets混合使用时所发生的事情。

scanf的调用需要一个数字。当您输入"1wjhue73b38409598“作为输入时,它将读取字符串开头的1,并在看到"w”时停止读取。因此n被设置为1。

然后,gets立即读取其余字符(即"wjhue73b38409598"),而不进行提示。因为1不是这个字符串的一部分,所以它不会被计算在内。

然而,还有另一个问题。由于n设置为1,因此str只能包含1个字符。所以gets调用写过了缓冲区的末尾。这将调用undefined behavior。在这种特殊情况下,事情看起来是可以正常工作的,但是对代码的微小更改可能会改变未定义行为的表现方式。

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

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

代码语言:javascript
复制
char str[50];
fgets(str, sizeof(str), stdin);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52841941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档