代码:
1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 int main(){ 7 8 char* s; 9 s = new char[50]; //必须要分配空间 10 cin.getline(s,5); 11 int i = 0; 12 while(s[i] != ‘\0‘){ 13 cout<<s[i]; 14 i++; 15 } 16 cout<<endl<<i<<endl; 17 cin.clear(); //当failbit位为1时需要clear,否则后面的getline读取为空字符串 18 19 string str; 20 getline(cin,str); 21 cout<<str<<endl; 22 getline(cin,str,‘#‘); 23 cout<<str<<endl; 24 getline(cin,str); 25 cout<<str<<endl; 26 27 return 0; 28 }
输入输出:
(input)slkdsa;34 slkd 4 sa;34 (input)hel#id hel id
分析:
C++中有两个getline函数,一个是在string头文件中,定义的是一个全局的函数,函数声明是istream& getline ( istream& is, string& str, char delim )与istream& getline ( istream& is, string& str );
另一个则是istream的成员函数,函数声明是istream& getline (char* s, streamsize n )与istream& getline (char* s, streamsize n, char delim );注意第二个getline是将读取的字符串存储在char数组中而不可以将该参数声明为string类型,因为C++编译器无法执行此默认转换。
getline函数大致流程:
1、首先判断istream的failbit位是否为1,为1的话意味着输入流的状态有错误,则不进行读操作,getline函数结束执行
2、从当前位置开始从输入流中依次读取单个字符并拷贝到缓冲区,直到遇到下列条件满足时,循环结束。
(1)遇到文件尾时停止读操作,并设置流对象的结束标记为1
(2)读到调用者指定的分隔符时,此时将分隔符之前的字符拷贝到缓冲区中,但分隔符本身不拷贝进去,并且下次读操作将从分隔符后的下一个字符开始。
(3)已经读了n-1个字符(n是调用者传入的第二个实参_Count的初值),此时要把流对象的错误标志位置1
利用getline连续读取直至文末
1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 int main(){ 7 8 string s; 9 while(getline(cin,s)){ 10 cout<<s<<endl;; 11 } 12 13 return 0; 14 }
时间: 2024-11-13 04:07:48