找数字?

geniuscaobo 2006-03-23 08:13:40
随便输入一字符串,例如“123fd45678fda789fdsa”用整型输出123,45678,789。并数出共有几个整型数,例如这个就是3个;下面我写的代码:
main()
{
int i,j,k=0;
char arr1[100],arr2[50],*p; /*arr1用来接字符串,arr2用来接每次出现数字的字符串*/
long int a[20],b,sum=0;/*a[20]用来接整数,*/
printf("\nInput the string:\n");
gets(arr1);
p=arr1;
while(*p!='\0')
{
if(*p>='0'&&*p<='9')
{
for(i=0;*p>='0'&&*p<='9';i++)
{
arr2[i]=*p;
p++;
}
for(j=0;arr2[j]!='\0';j++,i--)
{
b=pow(10,i-1);/*求10的i-1次方*/
sum=sum+b*arr2[j];/*求整数*/
}
a[k]=sum;
sum=0;
k++;/*计数*/
}
else
p++;
}
printf("total is:%d\n",k);
for(i=0;i<k;i++)
printf("%ld ",a[i]);
} 运行时出现Floating point error:Domain.为什么出现这样,我仔细查了程序,没发现错误。
望哪位帮助,不要认为这太简单了,不想回答。
...全文
221 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
SEUU 2006-03-24
  • 打赏
  • 举报
回复
老大.给点分吧
beamroad 2006-03-24
  • 打赏
  • 举报
回复
楼上写的很漂亮,在这里再说一个思路:


把字符串中的非数字字符替换为“空格”,同时记下数字的个数, 然后直接打印字符串
geniuscaobo 2006-03-23
  • 打赏
  • 举报
回复
嗑睡虫:谢你了,真羡慕你们啊,什么时候才有你们的水平:
geniuscaobo 2006-03-23
  • 打赏
  • 举报
回复
int main(void)
{
return 0;
}为什么要这样写;有什么意义
jixingzhong 2006-03-23
  • 打赏
  • 举报
回复
变量少了很多 ...

#include<stdio.h>
#include<stdlib.h>


int main()
{
int i,k=0;
char arr1[100],arr2[50],*p;
long int a[20];
printf("\nInput the string:\n");
gets(arr1);
p=arr1;
while(*p!='\0')
{
if(*p>='0'&&*p<='9')
{
for(i=0;*p>='0'&&*p<='9';i++)
{
arr2[i]=*p;
p++;
}
arr2[i] = '\0';
a[k++] = atoi(arr2);
}
else
p++;
}
printf("total is:%d\n",k);
for(i=0;i<k;i++)
printf("%ld ",a[i]);

return 0;
}
jixingzhong 2006-03-23
  • 打赏
  • 举报
回复
sum = atoi(arr2); memset(arr2,0,50);我怎么从来没看见过这种用法啊
风焱:sum= sum*10 + arr2[j];这个太妙了。但arr2[i]=*p-'0'这是什么。我没见过。
----------------------------
楼主应该是接触比较少,
用多了就知道了 ~
atoi ... 转换函数 ,功能和 我上面的程序中 strtol 差不多
memset ...内存设置,使得所有的空间都为某一个值
sum= sum*10 + arr2[j]; ....这个显然是很普通的事情 ....
arr2[i]=*p-'0'这是什么... arr2中是数字,但是这个数字是字符型的,比如字符型的1,它和数字型的 1 差别很大,arr2[i]=*p-'0'做的工作就是把字符型的数据转换成数字型数据
(楼主看 ASCII 码,字符和数字的转化是根据ASCII码的,大小差很多)
jixingzhong 2006-03-23
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>


int main()
{
int i,j,k=0;
char arr1[100],arr2[50],*p,*end;
/*arr1用来接字符串,arr2用来接每次出现数字的字符串*/
long int a[20],b;/*a*a[20]用来接整数,*/

printf("\nInput the string:\n");
gets(arr1);
p=arr1;

while(*p!='\0')
{
if(*p>='0'&&*p<='9')
{
for(i=0;*p>='0'&&*p<='9';i++)
{
arr2[i]=*p;
p++;
}
arr2[i] = '\0';
a[k++] = strtol(arr2, &end, 10); //调用库函数直接转化就可以了
}
else
p++;
}

printf("total is:%d\n",k);
for(i=0;i<k;i++)
printf("%ld ",a[i]);
return 0;
}
geniuscaobo 2006-03-23
  • 打赏
  • 举报
回复
三个行必有我师:int main(void)
sum = atoi(arr2); memset(arr2,0,50);我怎么从来没看见过这种用法啊
风焱:sum= sum*10 + arr2[j];这个太妙了。但arr2[i]=*p-'0'这是什么。我没见过。
我怎么很多都没见过啊。
firetoucher 2006-03-23
  • 打赏
  • 举报
回复
还忘了,你在for(j=0;arr2[j]!='\0';j++,i--)之前少了一句arr2[i]='\0';
没有帖上去。完整程序如下:

#include <stdio.h>
#include <math.h>

main()
{
int i,j,k=0;
char arr1[100],arr2[50],*p; /*arr1用来接字符串,arr2用来接每次出现数字的字符串*/
long int a[20],b,sum=0;/*a[20]用来接整数,*/
printf("\nInput the string:\n");
gets(arr1);
p=arr1;
while(*p!='\0')
{
if(*p>='0'&&*p<='9')
{
for(i=0;*p>='0'&&*p<='9';i++)
{
arr2[i]=*p - '0';
p++;
}

arr2[i]='\0';
for(j=0;arr2[j]!='\0';j++,i--)
{
sum= sum*10 + arr2[j];/*求整数*/
}
a[k]=sum;
sum=0;
k++;/*计数*/
}
else
p++;
}
printf("total is:%d\n",k);
for(i=0;i<k;i++)
printf("%ld ",a[i]);
}




FT
--
Anything one man can imagine, other men can make real.
firetoucher 2006-03-23
  • 打赏
  • 举报
回复
楼上都没有看到?它赋值是字符!!
main()
{
int i,j,k=0;
char arr1[100],arr2[50],*p;
long int a[20],b,sum=0;
printf("\nInput the string:\n");
gets(arr1);
p=arr1;
while(*p!='\0')
{
if(*p>='0'&&*p<='9')
{
for(i=0;*p>='0'&&*p<='9';i++)
{
arr2[i]=*p-'0';//这里!!!! arr2[i]=*p;
p++;
}
/*不要用pow,那是用浮点数的
for(j=0;arr2[j]!='\0';j++,i--)
{
b=pow(10,i-1);
sum=sum+b*arr2[j];
}
*/
//!!!!!改成这样

for(j=0;arr2[j]!='\0';j++,i--)
{
sum= sum*10 + arr2[j];/*求整数*/
}
//////

a[k]=sum;
sum=0;
k++;/*计数*/
}
else
p++;
}
printf("total is:%d\n",k);
for(i=0;i<k;i++)
printf("%ld ",a[i]);
}


FT
--
Anything one man can imagine, other men can make real.
duduhaha 2006-03-23
  • 打赏
  • 举报
回复
for(j=0;arr2[j]!='\0';j++,i--)
{
b=pow(10,i-1);/*求10的i-1次方*/
sum=sum+b*arr2[j];/*求整数*/
}
这段是你错误的根源.
1.
arr2[j]!='\0' 你开始没有对数组初始化,没法保证里面有'\0'.

2.你取了一个数后,没有对数组清零.这样再读第二个数就会犯错.

用标准库函数atoi,由字符串转化为整数比较好.
duduhaha 2006-03-23
  • 打赏
  • 举报
回复
给你改好了.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int i,k=0;
char arr1[100],*p; /*arr1用来接字符串,arr2用来接每次出现数字的字符串*/
char arr2[50] = {'\0'};
long int a[20],sum=0;/*a[20]用来接整数,*/
printf("\nInput the string:\n");
gets(arr1);
p=arr1;
while(*p!='\0')
{
if(*p>='0'&&*p<='9')
{
for(i=0;*p>='0'&&*p<='9';i++)
{
arr2[i]=*p;
p++;
}
sum = atoi(arr2);
memset(arr2,0,50);
a[k]=sum;
sum=0;
k++;/*计数*/
}
else
p++;
}
printf("total is:%d\n",k);
for(i=0;i<k;i++)
printf("%ld ",a[i]);
return 0;
}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧