C++ getline函数用法详解

时间:2025-02-11 16:52:35

虽然可以使用 cin 和 >> 运算符来输入字符串,
当 cin 读取数据时,
一旦它接触到第一个非空格字符即开始阅读,
当它读取到下一个空白字符时,它将停止读取。

以下面的语句为例:

 getline(cin,temp);

可以输入 “Mark” 或 “Twain”,但不能输入 “Mark Twain”,
因为 cin 不能输入包含嵌入空格的字符串。

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main()
{
    // string name;
    // cin>>name;//Jackie Cen
    // cout<<name;//Jackie
    
    string name;
    getline(cin,name);//Jackie Cen
    cout<<name;//Jackie Cen

    
    return 0;
}

为了解决这个问题,
可以使用一个叫做 getline 的 C++ 函数。
此函数可读取整行,包括前导和嵌入的空格,
并将其存储在字符串对象中。

其中 cin 是正在读取的输入流,
而 inputLine 是接收输入字符串的 string 变量的名称。

在使用getline读入一整行时,
若是前面是使用getchar()、cin这类读入了一个字母,
但是不会读入后续换行\n符号或者空格的输入时,再接getline()就容易出现问题。

这是因为输入数字之后,敲回车,产生的换行符仍然滞留在输入流了,
接着就被getline(cin,s)给读进去了,
此时的s=“\n”,所以实际上s只是读入了一个换行符\n。

而若是前面使用getline(),再又用getline()进行读入,此时不会发生问题。
getline()中读入结束的回车后,结束符不放入缓存区,会将读入的\n直接去除,
下一个输入前,缓冲区为空,并不会因为回车留下\n。

而cin的结束后,以及getchar()此类的读入结束后,按下回车或者使用空格读入下一个,
此时按下的回车或空格会还在缓存区,继续用getline()就会出现前面所提到的情况。
那么如何解决前面用了cin、getchar()后的输入呢?
可以直接在cin和getchar()后使用一个getchar()吃掉接下来的换行

5
123s
zheshi.wodepw
1234.5678
WanMei23333
pass*word.6