c语言问题,帮忙看一个程序,看错误出在什么地方,谢谢。

2025-03-06 23:36:25
推荐回答(5个)
回答1:

#include //没有注释的程序不是好程序,特别是用简单字母定义了一些变量,更需要注释
#include //为了防止数组越界,请你测试时输入的数字少于10个
void main()
{
char str[50],*pstr;
int num[10]={0},*pn;//数组全部初始为0
// pn=num;//在定义变量之前不能执行任何操作,除非赋初值
int i,k,kn,e,e10,digit;
int c;//把数字字符转为一位整数
int nc=0;//整数个数统计,也作为num[]的下标
int flag=0;//0标记字符不是数字,1标记字符是数字
i=0;
k=0;//表示连续数字字符的位数
digit=0;
kn=0;
printf("Please input a string.\n");
gets(str);
pstr=str;
str[49]='\0';//防止越界
printf("有效字符串是: \n%s \n",str);//
while(*(pstr+i)!='\0')
{
if((*(pstr+i)) >='0' && (*(pstr+i))<='9')
{
flag=1;
c=*(pstr+i)-48;//发现数字,开始往num[nc]放值,
num[nc]=num[nc]*10+c;//每次扩大十倍再加上一个个位数
}
else
{//现在的字母不是数字
if(flag==1)//如果刚才是数字,那么说明一段连续的数字结束了,即已经取得一个整数
{
nc++;//下标后移
//在否则,就只是一般字符了,不需要处理
flag=0;//标记为非数字
}
}
i++;///////////////////不要忘记
}//最终回得到nc个整数,
if((*(pstr+i-1)) >='0' && (*(pstr+i-1))<='9')
nc++;//注意,如果字符串的最后是数字,然后是'\0';
//那么上面的nc++执行不了(因为while()),所以这里补上

printf("The string has %d numbers.\nThey are:\n",nc);
pn=num;
for(i=0;i printf("%d ",*(pn+i));
printf("\n");
}

回答2:

朋友你那个程序我看了好久,就没怎么在你上面改了。我给你写了个,测试了几组数据都没什么问题。我是没有用指针的,程序如下:
#include
#include
void main()
{
char str[50];
int num[10];
int i,number=0,k=0,j=0;
printf("Please input a string.\n");
gets(str);
k=strlen(str);//这是求出字符串的长度;
for(i=0;i {
if(str[i]>='0'&&str[i]<='9')
number=number*10+str[i]-'0';//把数的字符转换成数;
else if(number!=0)
{
num[j++]=number; //把数放到数组中去;
number=0;
}
}
if(str[k-1]>='0'&&str[k-1]<='9')//如果最后是数字字符,就要考虑特殊处理;
num[j++]=number;
printf("The string has %d numbers.\nThey are:\n",j);
for(i=0;i printf("%d ",num[i]);
printf("\n");
}

回答3:

程序定义了不少无意义的变量,读起来也费解。
举个例子吧,当输入mai123456时,执行第一次循环时,由于*(pstr+i)!='\0'而执行else部分,又由于此时k还为0,而执行if语句之后*pn=number;,number并未被初始化,就被放入num数组中了。
先找个例子试着在纸上逐步运行你的程序吧,也有助于你发现错误。

回答4:

写程序要注释!!!你的程序看的头痛,我就在你的基础上改了,程序源代码要的是可读性,你这根本就没有,具体解决过程 你自己对照你的看看吧我修改的基本的都给了注释

int swap(char c)
{
switch(c)
{
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
}
}

//以下代码加在main

char str[50],*pstr;
int num[10],*pn;
int i,k,kn,digit;
i=0;k=0;digit=0;//kn=0;
printf("Please input a string.\n");
gets(str);
pstr=str;
while(*(pstr+i)!='\0')
{
if((*(pstr+i)) >='0' && (*(pstr+i))<='9')
{
*(num+k) = swap(*(pstr+i));//对NUM进行赋值 需要转换
k++;//数字的POS
digit++;//计数器
}
/*这里实在是没有必要
else
{

if(k>0)
{ number=*(pstr+i-1)-48;
kn=1;
while(kn { e10=1;
for(e=1;e<=kn;e++)
e10=e10*10;
number=number+(*(pstr+i-1-kn)-48)*e10;
kn++;

}
}
*pn=number;
pn++;

}
*/

i++;
}
printf("The string has %d numbers.\nThey are:\n",digit);
pn=num;
for(i=0;i printf("%d ",*(pn+i));
printf("\n");

回答5:

k=0; i++;
k不应该在执行每次循环后就清零吧?