輸入一個字符串,內有數字和非數字字符如:
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 ++;
}
