输入一个字符串,内有数字和非数字字符如:
a123x456_17960?302tab5876将其中连续的数字作为一个整数,依次存放到一数组a中。例如123放在a[0]中,456放在a[1]中………统计共有多少个整数。并输出这些数字。
/*****************************************************************
输入一个字符串,内有数字和非数字字符如:a123x456_17960?302tab5876
将其中连续的数字作为一个整数,依次存放到一数组a中。例如123放在a[0]中,
456放在a[1]中………统计共有多少个整数。并输出这些数。
******************************************************************/
#include <iostream>
#include<string>
using namespace std;
#define max_size 100
void main()
{
int flag=0,digit=0,a[10],i,n=0;
char b[max_size];
cout<<"输入一个字符串:";
cin>>b;
for(i=0;b[i]!='\0';i++)
{
while((b[i]>='0')&&(b[i]<='9'))
{
flag=1;
digit=digit*10+b[i]-'0';
i++;
}
if(flag==1)
{
a[n]=digit;
n++;
digit=0;
flag=0;
}
}
cout<<"统计得含有整数的个数为:"<<n<<endl;
cout<<"这些数字是:"<<endl;
for(i=0;i<n;i++)
{
cout<<a[i];cout<<endl;
}
}
代码运行后发现一个问题,如果输入的字符串包含空格,比如11a 22s 33f这样,只能识别到第一个空格之前的字符串,这里也就是11,空格之后的字符串识别不到,查阅了相关资料后发现,应该是这样的问题:
cin标准输入读取string有两个规则:1、读取并忽略开头所有空白字符(如空格,换行符,制表符);2、读取字符直至再次遇到空白字符,读取终止。
这样就解释清楚了,因为再次遇到了空白字符,所以后面的字符串没有被读取进来。
在上面基础上我修改了代码,使用getline函数读取整行文本,只有在getline遇到换行符,才会停止读取并返回。
getline函数接受两个参数:一个输入流对象和一个string对象。
string str;
getline(cin,str)
这里就需要把string类型转换为char*数组,具体的转换方法如下:
char ch[100];
string str;
把char*(c类型的string)数组转换为string:
str = ch; //即可
str.assign(ch); //也可
把string类型转换为char*数组:
strcpy(ch,str.c_str()); //即可
for(int i = 0; i < str.length(); i++) //也可
{
ch = str.at(i);
ch ++;
}