因为从流中读入数据保存到string中,string会遇到空格就停止录入(这是我很久都未解决的问题,今天终于解决了,真的巨开心)。这样当我们输入一行带空格的字符串,就要考虑getline函数,从流中读入一行字符串。
1.以下是输入3行的示例。
#include<iostream>
#include<string>
using namespace std;
int main(){
string str[3];
for(int j=0;j<3;j++){
getline(cin, str[j]);
}
}
2 包含其他输入后读入多行字符串
例如一些编程题要求先输入字符串行数,然后再一行一行读入字符串。如果正常顺写编程的话,会发现第一行字符串读入的是空,后续才能正常录入每行字符串。
这是因为第一行输入一个int数据后,换行符并没有被忽略,直接被准备读入第一行字符串的getline俘获。
所以需要在第一行输入一个int数据后,调用cin.ignore()忽略下面的一个流录入,将其抛弃。
#include<iostream>
using namespace std;
int main(){
int N;
cin>>N;
cin.ignore(); //取消换行键的读入
string strCinLine[100];
for(int i =0;i<N;i++)
getline(cin,strCinLine[i]);
}
或者给strCinLine动态申请空间,节省空间开销。
#include<iostream>
using namespace std;
int main(){
int N;
cin>>N;
cin.ignore(); //取消换行键的读入
string* strCinLine = new string[N];
for(int i =0;i<N;i++)
getline(cin,strCinLine[i]);
delete []strCinLine; //记得释放动态空间
strCinLine = NULL;
}
1.如果是字符串,则只需分割即可。则可用如下代码。
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main() {
string str = "hello world sperated by spaces\tand\nhuiche";
vector<string> arr;
istringstream ss(str);
string word;
while(ss>>word) {
arr.push_back(word);
}
for(size_t i=0; i<arr.size(); i++) {
cout << arr[i] << endl;
}
return 0;
}
2.如果是一串数字的话,则需现将其按空格分开,再将每个分开的字符串化为数字,具体做法如下:(有的编译器可能通不过)
(1)字符串转数字:使用sscanf()函数
char str[]="1234321";
int a;
sscanf(str,"%d",&a);
.............
char str[]="123.321";
double a;
sscanf(str,"%lf",&a);
.............
char str[]="AF";
int a;
sscanf(str,"%x",&a); //16进制转换成10进制
另外也可以使用atoi(),atol(),atof().
(2)使用stringstream类
用ostringstream对象写一个字符串,类似于sprintf()
ostringstream s1;
int i = 22;
s1 << "Hello " << i << endl;
string s2 = s1.str();
cout << s2;
用istringstream对象读一个字符串,类似于sscanf()
istringstream stream1;
string string1 = "25";
stream1.str(string1);
int i;
stream1 >> i;
cout << i << endl; // displays 25
(3)C++可以通过 atoi函数把字符转换成数字。
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int n;
char *str = "12345";
n = atoi(str);
printf("int=%d\n",n);
return 0;
}
附:
C++从屏幕输入一行以空格分割的数字,存入整型数组(数字个数未知)
方法一:#include<iostream>
using namespace std;
int main()
{
int a[50];
int i = 0;
char c;
while((c=getchar())!='\n')
{
if(c!=' ')//把这句判断条件改动
{
ungetc(c,stdin);
cin>>a[i++];
}
}
for(int j=0;j<i;j++)
{
cout<<"a["<<j<<"]:"<<a[j]<<endl;
}
}
方法二:#include<iostream>
using namespace std;
int main()
{
int a[20];
int i = 0;
char c;
cin>>a[i++];
while((c=getchar())!='\n')
{
cin>>a[i++];
}
for(int j=0;j<i;j++)
{
cout<<"a["<<j<<"]:"<<a[j]<<endl;
}
}
#include<iostream>
using namespace std;
int main()
{
int a[50];
int i = 0;
char c;
while((c=getchar())!='\n')
{
if(c!=' ')//把这句判断条件改动
{
ungetc(c,stdin);
cin>>a[i++];
}
}
for(int j=0;j<i;j++)
{
cout<<"a["<<j<<"]:"<<a[j]<<endl;
}
}
#include<iostream>
using namespace std;
int main()
{
int a[20];
int i = 0;
char c;
cin>>a[i++];
while((c=getchar())!='\n')
{
cin>>a[i++];
}
for(int j=0;j<i;j++)
{
cout<<"a["<<j<<"]:"<<a[j]<<endl;
}
}