统计字符串中的数字,并把连续数字作为整数输出的~

南气子水 2011-03-14 10:12:19
例如:输入字符串m123h456,输出整数123 456

#include <stdio.h>
int* process(char* p);
int n=0;
int main()
{
char strin[100];
int* a;
int i=0;
gets(strin);
a=process(strin);
for(i=0;i<n;i++)
{
printf("%d\t",*(a+i));
}
printf("\n");
return 0;
}
int* process(char* p)
{
int j=0,k=0;
int el=1;
int a[100]={0};
int sum=0;
char* q=p;
while(*p!=0)
{
q=p;
while(*q>='0' && *q<='9')
{
j++;
q++;
}
if(j>0)
{
for(j=j-1;j>=0;j--)
{
sum+=((*(p+j)-48)*el);
el=el*10;
}
a[n]=sum;
printf("%d\n",a[n]);//加上这句,就可以正确输出数组a,不加就不行,为什么?
n++;
j=0;
el=1;
sum=0;
}
p=q;
if(*p!=0)
{
p++;
}
}
return a;
}
...全文
791 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-03-16
  • 打赏
  • 举报
回复
《编译原理》词法分析 有限状态自动机
masmaster 2011-03-16
  • 打赏
  • 举报
回复
修改一下,输出【连续】的数字串
root@~ #cat str2int.c
#include <stdio.h>

int main (void) {

char str[80];
scanf("%s",str);

int num=0,len=0,base=1,temp,i=0,j=0;
int digit[10];

while(str[len]!='\0') {
len++;
}

len--;
while(len>=0) {
if(str[len]>='0'&&str[len]<='9') {
for(i=len;str[i]>='0'&&str[i]<='9';i--) {
temp=str[i]-'0';
num+=temp*base;
base*=10;
}
if(num>=10) {
digit[j]=num;
num=0;
base=1;
j++;
len=i;
}else{
num=0;
base=1;
}
}
len--;
}

for(j--;j>=0;j--) { printf ("%i ",digit[j]);}
printf ("\n");

return 0;

}

root@~ #


测试:

root@~ #./str2int
m12hm0m123m9m1212
12 123 1212
root@~ #./str2int
1m123m0jlj;1234
123 1234
root@~ #
masmaster 2011-03-16
  • 打赏
  • 举报
回复
root@~ #cat str2int.c
#include <stdio.h>

int main (void) {

char str[80];
scanf("%s",str);

int num=0,len=0,base=1,temp,i=0,j=0;
int digit[10];

while(str[len]!='\0') {
len++;
}

len--;
while(len>=0) {
if(str[len]>='0'&&str[len]<='9') {
for(i=len;str[i]>='0'&&str[i]<='9';i--) {
temp=str[i]-'0';
num+=temp*base;
base*=10;
}
digit[j]=num;
num=0;
base=1;
j++;
len=i;
}
len--;
}

for(j--;j>=0;j--) { printf ("%i ",digit[j]);}
printf ("\n");

return 0;

}

root@~ #


测试:

root@~ #./str2int
hm123fg3456789
123 3456789
root@~ #./str2int
sdf123sdf3df4sdf555
123 3 4 555
root@~ #
qq120848369 2011-03-15
  • 打赏
  • 举报
回复
额,改改输入输出而已,没用C++的东西.
flowers_2015 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 delphiwcdj 的回复:]
C/C++ code

#include<iostream>
#include <cstring>
using namespace std;

int main()
{
char sdata[]="m123h456";
char * pch = strtok(sdata, "mh");
while (pch)
{
printf……
[/Quote]
老大,你的是C++吧。。。。。这边的老兄是C语言的问题。
qq120848369 2011-03-15
  • 打赏
  • 举报
回复
#include <iostream>
#include <cstring>
using namespace std;

bool isDigit(char c)
{
return '0'<c && c<'9';
}

void print(const char *str)
{
bool last=true; //打印

if( !isDigit(str[0]) )
{
last=false; //不打印
}

for(int i=1;i<(int)strlen(str);++i)
{
if(isDigit(str[i]))
{
if( last && ( !isDigit(str[i-1]) || str[i-1]+1!=str[i] ) )
{
cout<<" ";
}

last=true;
cout<<str[i];
}
}

cout<<endl;
}

int main()
{
const char *str="m123h456";

print(str);

return 0;
}


















论坛签名======================================================================

mhjerry:你好!
截至 2011-03-14 22:12:19 前:
你已发帖 22 个, 未结贴 2 个;
结贴率为: 90.91%

当您的问题得到解答后请及时结贴.

http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html
http://topic.csdn.net/u/20100626/09/f35a4763-4b59-49c3-8061-d48fdbc29561.html

如何给分和结贴?
http://community.csdn.net/Help/HelpCenter.htm#结帖

如何给自己的回帖中也加上签名?
http://blog.csdn.net/q107770540/archive/2011/03/15/6250007.aspx
dooX8086 2011-03-15
  • 打赏
  • 举报
回复
1, 返回局部变量(地址)是不安全的,数据得不到保定(看人品, reseale 版 roll 99, 都没用)
2, 动态分配的内存.会直到 delete/free 才会释放(程序退出时系统也会回收)l
南气子水 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 moorsf 的回复:]
引用 18 楼 mhjerry 的回复:
那么现在我又有新的问题:子函数中数组a是分配在动态存储区内,子函数结束后应该释放呀,为什么还能输出值?


函数只是临时占用,函数结束后,堆栈指针回位(就算是你说的释放了吧),这部分区域已经是垃圾区。程序逻辑正常的情况下,是不会去访问这块地址的数据。因为你在函数中把之前数组的地址给返回了,所以主函数就用这个地址找到这块区域。
[/Quote]我被说的有点糊涂了,那为什么在proce函数中加入printf语句后,就能正常了?这样就没有数据覆盖的问题了?
delphiwcdj 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 mhjerry 的回复:]

引用 17 楼 moorsf 的回复:
引用 11 楼 mhjerry 的回复:
读取123后,并没有结束子函数呀,为什么456读不到?


原来在调用process时的数组,在process返回后,因为没有其他调用发生,所以虽然是错误的使用,但结果还算完好。
for(i=0;i<n;i++)
{
printf("%d\t",*(a+i));
}
这个是一个循环。第一个数12……
[/Quote]
可以通过返回值,比如函数返回值,参数引用等方式将动态分配的空间地址返回,然后在main中释放
moorsf 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 mhjerry 的回复:]
那么现在我又有新的问题:子函数中数组a是分配在动态存储区内,子函数结束后应该释放呀,为什么还能输出值?
[/Quote]

函数只是临时占用,函数结束后,堆栈指针回位(就算是你说的释放了吧),这部分区域已经是垃圾区。程序逻辑正常的情况下,是不会去访问这块地址的数据。因为你在函数中把之前数组的地址给返回了,所以主函数就用这个地址找到这块区域。
南气子水 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 moorsf 的回复:]
引用 11 楼 mhjerry 的回复:
读取123后,并没有结束子函数呀,为什么456读不到?


原来在调用process时的数组,在process返回后,因为没有其他调用发生,所以虽然是错误的使用,但结果还算完好。
for(i=0;i<n;i++)
{
printf("%d\t",*(a+i));
}
这个是一个循环。第一个数123在调用printf前读到了,所以没被破……
[/Quote]
那么现在我又有新的问题:子函数中数组a是分配在动态存储区内,子函数结束后应该释放呀,为什么还能输出值?
moorsf 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mhjerry 的回复:]
读取123后,并没有结束子函数呀,为什么456读不到?
[/Quote]

原来在调用process时的数组,在process返回后,因为没有其他调用发生,所以虽然是错误的使用,但结果还算完好。
for(i=0;i<n;i++)
{
printf("%d\t",*(a+i));
}
这个是一个循环。第一个数123在调用printf前读到了,所以没被破坏。printf是一个函数,那么它也要有压栈,出栈的操作,在输出123的时候,这个函数的调用把原来存在栈中的数据覆盖了,所以456取到的就可能是无效的值了。
delphiwcdj 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 mhjerry 的回复:]

引用 12 楼 delphiwcdj 的回复:
引用 8 楼 mhjerry 的回复:

引用 6 楼 delphiwcdj 的回复:
引用 4 楼 delphiwcdj 的回复:

那条不是输出语句吗,不加当然输出了

是局部变量的问题,当回到main后,int* process(char* p)的数组a已经不存在了,所以输不出来


C/C++ code
retur……
[/Quote]
不完全是,动态分配的内存要自己释放,比如new, malloc
南气子水 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 masmaster 的回复:]
输出123 456还是123456 ?
[/Quote]123
南气子水 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 delphiwcdj 的回复:]
引用 8 楼 mhjerry 的回复:

引用 6 楼 delphiwcdj 的回复:
引用 4 楼 delphiwcdj 的回复:

那条不是输出语句吗,不加当然输出了

是局部变量的问题,当回到main后,int* process(char* p)的数组a已经不存在了,所以输不出来


C/C++ code
return a;

不把数组a的地址赋给主函数中指针变量……
[/Quote]
是不是在子函数里定义的所有变量,子函数结束后都会释放掉~
masmaster 2011-03-14
  • 打赏
  • 举报
回复
输出123 456还是123456 ?
delphiwcdj 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mhjerry 的回复:]

引用 6 楼 delphiwcdj 的回复:
引用 4 楼 delphiwcdj 的回复:

那条不是输出语句吗,不加当然输出了

是局部变量的问题,当回到main后,int* process(char* p)的数组a已经不存在了,所以输不出来


C/C++ code
return a;

不把数组a的地址赋给主函数中指针变量a了吗?
如果说在子函数结束后,子函数中的数……
[/Quote]
这种是未定义行为,依赖编译器的
南气子水 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 moorsf 的回复:]
引用 3 楼 mhjerry 的回复:
引用 2 楼 moorsf 的回复:
int a[100]在堆栈中,process函数返回后,又调用了别的函数。所以原来a数组的数据被破坏了。
a应该在主函数中申明,用指针方式传入process函数。
那为什么,输入m123h456时,确可以输出123?

123是第一个数据,在主函数中调用printf前已经读取到,压到栈中,所以这个能输出。
[/Quote]
读取123后,并没有结束子函数呀,为什么456读不到?
delphiwcdj 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 delphiwcdj 的回复:]

引用 5 楼 mhjerry 的回复:

不加C/C++ code
printf("%d\n",a[n]);

输入:m123h456
输出:m123h456
123 4063608
请按任意键继续. . .

改为:int* process(char*& p);就行了
[/Quote]
看错了,改为:

#include <stdio.h>
int* process(char* p, int a[]);
int n=0;
int main()
{
char strin[100];
int a[100];
int i=0;
gets(strin);
process(strin, a);
for(i=0;i<n;i++)
{
printf("%d\t",*(a+i));
}
printf("\n");
return 0;
}
int* process(char* p, int a[])
{
int j=0,k=0;
int el=1;
//int a[100]={0};
int sum=0;
char* q=p;
while(*p!=0)
{
q=p;
while(*q>='0' && *q<='9')
{
j++;
q++;
}
if(j>0)
{
for(j=j-1;j>=0;j--)
{
sum+=((*(p+j)-48)*el);
el=el*10;
}
a[n]=sum;
printf("%d\n",a[n]);//加上这句,就可以正确输出数组a,不加就不行,为什么?
n++;
j=0;
el=1;
sum=0;
}
p=q;
if(*p!=0)
{
p++;
}
}
return a;
}
moorsf 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mhjerry 的回复:]
引用 2 楼 moorsf 的回复:
int a[100]在堆栈中,process函数返回后,又调用了别的函数。所以原来a数组的数据被破坏了。
a应该在主函数中申明,用指针方式传入process函数。
那为什么,输入m123h456时,确可以输出123?
[/Quote]
123是第一个数据,在主函数中调用printf前已经读取到,压到栈中,所以这个能输出。
加载更多回复(8)

70,027

社区成员

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

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