输入一个字符串,统计共有多少个整数并输出。
输入一个字符串,内有数字和非数字字符如:
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 ++;
}