问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

(C语言)关于统计一行数字字符中每个数字字符出现的次数。

发布网友 发布时间:2022-04-28 12:08

我来回答

3个回答

热心网友 时间:2022-04-27 16:34

大部分错误都集在中stat方法中,如下:

void stat(char *s,int *num) {
    int i;
    char ch;
    ch=s[i]; //你上面只是定义了i,从未赋值,i的值就是一个随机数
    while((ch=getchar())!='\n') { //你前面的indata就已经读入数据到s中了,这里只应该从s中读取并比较它是不是\0就可以了,而不应该是getchar
        if(ch>='0'&&ch<='9')
            num[ch-'0']+=1;
    }
}
另外一个很重要的错误,你的num数组在使用前也并未初始化,会导至num中的数字也全部是随机的

修改如下

#include <stdio.h>
#define M 10
#define N 10
void indata(char *s) {
    int i;
    for(i=0; i<M; i++)
        s[i]=getchar();
}
void stat(char *s,int *num) {
    int i=0;
    char ch;
    ch=s[i];//取第一个元素
    for(; i<N; i++) num[i]=0; //num初始化
    i=0;
    while(ch!='\0') {
        if(ch>='0'&&ch<='9')
            num[ch-'0']++;
        ch=s[++i];//取下一元素
    }
}
void outdata(int *num) {
    int i;
    for(i=0; i<N; i++)
        printf("%d : %d\n",i,num[i]);
}
main() {
    int num[N];
    char s[M];
    indata(s);
    stat(s,num);
    printf("Output the result:\n");
    outdata(num);
}

//当然stat也可以进一步简化,变为
void stat(char *s,int *num) {
    int i=0;
    char ch;
    for(; i<N; i++) num[i]=0;
    i=0;
    while((ch=s[i++])!='\0') {
        if(ch>='0'&&ch<='9')
            num[ch-'0']++;
    }
}

热心网友 时间:2022-04-27 17:52

#include<stdio.h>

#define M 10
#define N 10

void indata(char *s)

    int i = 0;
    
    //这里的条件应该是i<M-1而不是i<M或者s这个数组定义成M+1个,因为s最终会变成一个字符串,你得给他留一个\0的位置
    for(i=0; i<M-1; i++) 
    {
        s[i] = getchar();
    }
    //这个时候i的位置就是字符串尾
    s[i] = '\0';
}

//这个函数可能你是想表达遍历s这个数组,然后找到某一个数字,在num相应位置计数+1
//但是你的ch只有一开始变成了s[0] 后面就没有变过啊
/*
void stat(char *s,int *num)

    int  i  = 0; 
    char ch = '\0';
    
    ch = s[i];
    
    while((ch=getchar()) != '\n') 
    { 
        if(ch >= '0' && ch <= '9') 
        {
            num[ch-'0'] += 1; 
        }
    } 
}
*/

void stat(char *s, int *num)
{
    int i = 0;
    
    for (i = 0; i < M; i++)
    {
        if(s[i] >= '0' && s[i] <= '9') 
        {
            num[s[i]-'0']++;
        }
    }
}

void outdata(int *num)

    int i = 0;
    
    for(i=0; i<N; i++) 
    {
        printf("%d : %d\n",i,num[i]);
    }
}

main()

    int num[N] = {0}; 
    char s[M] = {0}; 
    
    indata(s);
    printf("s:[%s]\n", s);//indata改变了s,你就把s打印出来能更好的找到问题
    
    stat(s, num);
    
    printf("Output the result:\n"); 
    outdata(num);
}

最后,初学者一定要养成良好的习惯,变量定义后一定要初始化,for循环或者if else后面一定要加{}即使只有一行 main()这个也很不规范应该是int main(int argc, char *argv[])

字符串的问题是我想岔了,题主可能并不是想要一个字符串只是想要一个字符数组那最后可以不加\0

stat函数中的for (i = 0; i < M; i++)条件我改的也有问题,如果s当字符串用可以改成for (i = 0; i < M && '\0' != s[i]; i++)这种,但如果s当字符数组用可能入参就要加s的个数了。

热心网友 时间:2022-04-27 19:27

这道题目可以直接使用for和switch来实现,
因为只有0-9这10个数字,
然后定义一个数组int a[10]做计数器,
在遍历字符串中的字符时,
用于记录这个10数字的出现的次数。追问主要是我不太清楚我的程序是哪里出了问题导致结果不对。

追答你把代码贴出来,明天有空了,我帮你看下。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
咖喱鸡块怎样烧好吃 小米摄像头安全吗会被别人看到吗 小米摄像头会被别人入侵吗 广联达计价软件gbq4.0中怎么显示小数位数 脸干怎么补水最有效 脸干补水最好土方法 为什么退契税 首套购房契税为什么退回 契税为什么会退 退购房契税什么意思 为什么买了房子要退契税 C语言 统计数字(count) 编程 求找出程序的错误 c语言统计大小写字母 数字个数 c语言程序统计数字 C语言:编写程序,输入若干个数字,并统计每个数字出现的个数。 C语言 数字字符统计 C语言:从键盘输入20个整数,统计不同数字的个数 用c语言统计数字出现的次数 c语言问题 统计不同数字的个数。 c语言问题 统计不同数字个数 C语言编程题 统计数字字符个数? c语言输入一行字符串,如何统计其中的字母和数字的个数 c语言统计数字位数问题 在c语言中怎么统计数字字符字母个数 请问c语言当中,如何统计数字各自出现的次数 c语言输入数据统计数字个数 木门的十大品牌有哪些? 中国木门十大品牌都有哪些? 十大木门品牌都是哪些 十大木门品牌有哪些? 玉溪玉达木门公司销售 电话号码是多少? 用C语言怎样写数据统计代码 C语言, 统计数组每个元素个数怎么做? 各位大侠,请问在公文中腰转发别的单位传来的文件,标题是用“关于转发。。”还是“转发关于。。”? 多层转发是必须省掉什么 如何区分印发、转发和批转? 转发文件发文机关在书名号内还是外 轻触开关在遥控器中起什么作用? 将下级单位工作管理事项给其他下级单位下发,用转发还是其他的公文模式? 康佳kk-y352语音触控遥控器,没有使用说明书,如何使用? 批转通知与转发通知有什么区别? 电视遥控器按钮有哪些功能 海信电视小熊遥控器触控功能没反应了 小米电视遥控器应用前面的触控怎么操作 想买神画Y1,它的遥控器是怎么触控法? 三星电视的有触摸板遥控器只能开关机、其余功能不好使且无法在屏幕显示 profibus通信协议 什么是touch智控? 为什么win10取消密码后还需要密码登陆 中国电信tv怎么设置 win10设置开机密码和PIN码后,开机仍然不需要密码,怎么办?