c++编程,求找错
这是题目要求,写出来倒是没有error,就是存在逻辑错误,还请高手们帮帮忙吧
编程实现输入一个字符串,将其中连续的数字作为一个整数,依次存放到数组a中 例如:字符串为“ab123&gh6741kpen589”,
则将123存在a[0]中,6741存在a[1]中,589存在a[2]中。
#include<stdio.h>
#include<stdlib.h>
int fun(char *p,int *pa);
int main()
{
char p[20];
int a[20],d,i;
gets(p);
d=fun(p,a);
for(i=0;i<d;i++)
printf("%d",a[i]);
system("pause");
return 0;
}
int fun(char *p,int *pa)
{
int i,j,k,e,n,m,d;
i=0;j=0;d=0;
while(*(p+i)!='\0')
{
if(*(p+i)>='0'&&*(p+i)<='9')
j++;
else
{
if(j>0)
{
n=*(p+i-1)-'0';
k=1;
while(k<j)
{
e=1;
for(m=1;m<=k;m++)
{
e=e*10;
n=n+(*(p+i-1-k)-'0')*e;
k++;
}
}
*pa=n;
d++;
pa++;
j=0;
}
i++;
}
}
return d;
}
[解决办法]
代码像海绵,里面总是有水分的。只要你肯用力去挤,多半就能让它更干一点。
那么,让我们想想,还有什么地方不对劲呢?嗯,处理过程中对所有的数字字符串我们都扫瞄了两遍,这又何必呢:
#include<stdio.h>#include<stdlib.h>int fun(char *p,int *pa);int main(){ char p[200]; int a[20],d,i; gets(p); d=fun(p,a); for(i=0;i<d;i++) printf("%d\n",a[i]); system("pause"); return 0;}int fun(char *p,int *pa){ int n=0,d=0; int flag=1,noNumber=1; while(flag) { flag=*p!='\0'; if(*p>='0'&&*p<='9') { noNumber=0; // 维护这个标记来取代对数字字符的反复扫描 n=n*10+*p++-'0'; // 见到数字就直接转换,不等二次扫描了 } else { if (!noNumber) // 当前字符不是数字了,是刚发生的改变吗? { // 是刚发生的 noNumber=1; // 记录下这个改变,避免反复处理后续操作。 *pa++=n; // 把前面的数字保存到数组中。 n=0; ++d; } ++p; } } return d;}