输入一个字符串,统计共有多少个整数并输出。

输入一个字符串,内有数字和非数字字符如:

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]!=' ';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 ++;
}

这样就解决了这个问题,可以找出读入的包含空白字符字符串中的数字了。