c++将字符串中的连续数字提取出,并保存到数组。

例如:string=“06 2000 2130,60 0310 0430,80 0732 0741'0816 0937'0955 1017'1217 1325,07 1142 1220,15 1200 1217'1236 1237,.”得到的结果为b[0]=06,b[1]=2000,b[3]=2130,b[4]=60以此类推。。急需解答,望赐教。主要是将0开头的数字也要保存完整,像b[0]中的“06”

此程序是以数字形式保存到数组中的(长了点哈)!!!
#include <iostream>
#include <cmath>
#define N 100
using namespace std;
int fac(char *p,int n);
void main ()
{
char s[N],*p,*temp;
long flag=1,count,i,j=-1,a[N];
p=s;
cin>>s;
while(*p!='\0')
{
if (*p>='0'&&*p<='9')
{
if (flag==1) //确定数字的起始位置
{ temp=p;
j++;
count=0;
}
count++;//统计出数字的位数
p++;
flag=0;
}
else
if(flag==0)
{ *(a+j)=fac(temp,count);//将字符串转换为数字
flag=1;
}
else
{
p++;
flag=1;
}
if(*p=='\0'&&flag==0)//判断字符串是否为数字结尾,若为字符串结尾,则输出最后的数字。
*(a+j)=fac(temp,count);
}
cout<<"共有"<<j+1<<"个数,这些数是:"<<endl;
for (i=0;i<=j;i++)
cout<<a[i]<<" ";
cout<<endl;
}
//函数功能:将字符串转化为数字。
int fac(char *p,int n)
{
int f;
if (n==1) f=*p-'0';
else
f=(*p-'0')*(int)pow(10,n-1)+fac(++p,n-1);
return f;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-29
//////////////////楼主的格式应该只能用字符串了 数字不带这么存的/////////////////////////////////
06 2000 2130 60 0310 0430 80 0732 0741 0816 0937 0955 1017 1217 13
25 07 1142 1220 15 1200 1217 1236 Press any key to continue
#include <iostream>

using namespace std;
void main()
{
int i,j,k,nLen;
char aa[]="06 2000 2130,60 0310 0430,80 0732 0741'0816 0937'0955 1017'1217 1325,07 1142 1220,15 1200 1217'1236 1237";
char bb[30][10]={0};
nLen = strlen(aa);
for (i=0,j=0,k=0;i<nLen;i++)
{
if (aa[i]!=' ' && aa[i]!='\'' && aa[i]!=',')
{
bb[j][k] = aa[i];
k++;
}
else
{
bb[j][k] = '\0';
k=0;
j++;
}
}
for (i=0;i<j;i++)
printf("%s ",bb[i]);
}

有问题请追问 满意记得采纳哦
第2个回答  2011-09-29
C库中提供了strtok/wcstok来实现类似的功能,但是它们具有明显的缺点:
1. 不可重入性。这是因为它用内部的静态变量来保存相关状态。如果C库实现没有考虑TLS的话,则还有竞争条件的问题(更多信息可以参考<Windows via C/C++, Fifth Edition> Chapter 21: Thread-Local Storage)。
2. 参数必须是可写入的。
3. 参数必须是C风格字符串。
4. 总是跳过空白。
下面是一个早期字符串函数的例程(改编自Matthew Wilson《Extended STL, Volume 1》 Chapter 27 ):
#include <iostream>
using namespace std;

int main()
{
char str[] = "abc,def;ghi,jkl;;";
char* outer = NULL;
char* inner = NULL;

for( outer = strtok( str, ";") ; NULL != outer; outer = strtok(NULL, ";") )
{
printf( "Outer token: %s\n", outer );

//for( inner = strtok( outer, ","); NULL != inner; inner = strtok( NULL, ",") )
//{
// printf( "Inner token: %s\n", inner );
//}
}

return 0;
}

详情请见http://www.cppblog.com/db123/archive/2009/05/21/83556.html
第3个回答  推荐于2016-04-04
#include <iostream>
#include <string>
using namespace std;

void main()
{
string str = "06 2000 2130,60 0310 0430,80 0732 0741'0816 0937'0955 1017'1217 1325,07 1142 1220,15 1200 1217'1236 1237,.";
string b[30];
int i, j = 0;
for (i = 0; i != 30; ++i)
{
b[i] = "";
}
for (i = 0; i != str.length(); ++i)
{
if (str.at(i) >= '0' && str.at(i) <= '9')
{
b[j] += str.at(i);
}
else
{
b[j] += '\0';
j++;
}
}
for (i = 0; i != j; ++i)
{
cout << b[i] << endl;
}
}本回答被提问者采纳
第4个回答  2011-09-29
#include "stdio.h"
void main()
{
char string[]="06 2000 2130,60 0310 0430,80 0732 0741'0816 0937'0955 1017'1217 1325,07 1142 1220,15 1200 1217'1236 1237 11";
char b[100][10];
char *p=string;
int i=0,j=0;
while(*p)
{
if(*p>='0' && *p<='9')
b[i][j++]=*p++;
else
{
b[i][j]=0;
if(*(p+1)>='0' && *(p+1)<='9')
{
i++;
j=0;
}
p++;
}
}
b[i][j]=0;
printf("The string is: %s\n",string);
for(j=0;j<=i;j++)
{
printf("b[%d]=%s\n",j,b[j]);
}
}
相似回答