在做杭电OJ1048题时,首先要输入一串"START"字符串,表示翻译的开始,随后用的是 cin.getline()函数来获取一段字符串,但是发现并没有读到字符串,用strlen函数检查后发现长度为0,在网上搜索了大量资料才有了头绪。错误的情形类似下面代码,每次用strlen函数测得数组长度为0.
#include<iostream>
#include<string>
using namespace std;
int main(){
char a[20],b[20];
cin >> b;
cin.getline(a,20);
cout << strlen(a);
return 0;
}
//示例输入:B[回车]
//输出:0
要弄清这个,得先了解缓冲区,键盘输入到缓冲区,cin 和cin.getline()实际上是从缓冲区读入数据,当缓冲区有内容时,会直接从缓冲区读取,不会要求键盘输入。如下面代码:
#include<iostream>
#include<string>
using namespace std;
int main(){
char a[20],b[20];
cin >> b;
cin.ignore(3, 'a'); //忽略输入流里的3个字符包括空格,或者遇到字符a提前结束
cin>>a; //cin>>直接从缓冲区提取,没有再次输入了
cout << a;
return 0;
}
示例输入:asd dsaa[回车]
输出:aa
解释:以空格隔开后,cin可以直接忽略空格,将"asd"存入b数组中,缓冲区剩余\0dsaa,随后的输入直接从缓冲区读取,并忽略前三个字符故没有再次输入
产生无法获取字符串的错误,我猜想是按下回车会在缓冲区留下某个能够分隔的字符,于是用cin.ignore(1024,'\n')放到cin.getline(a,20);前,发现能够读入。
getline()原型声明如下:
istream& getline( char* pch, int nCount, char delim = '\n' );
istream& getline( unsigned char* puch, int nCount, char delim = '\n' );
istream& getline( signed char* psch, int nCount, char delim = '\n' );
默认情况下以\n为分隔符
原因为按下回车产生了一个\n,为分隔符,实际读入的字符串个数为零。
默认情况下以\n为分隔符
原因为按下回车产生了一个\n,为分隔符,实际读入的字符串个数为零。
解决方法,在cin.getline(a,20);前加上一句cin.ignore(1024, '\n');第一个参数设置足够大,实际起作用的只有第二个参数,将\n及前1024个字符忽略
cin>> , cin.getline() 的区别:前者能够直接忽略\n,空格,而后者不能
cin>> , cin.getline() 的区别:前者能够直接忽略\n,空格,而后者不能