(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数字的出现的次数。追问主要是我不太清楚我的程序是哪里出了问题导致结果不对。
追答你把代码贴出来,明天有空了,我帮你看下。