C++中getline中的一个奇葩问题

本文探讨了在C++中如何正确地结合使用cin和getline函数来读取整行输入,尤其是在cin之后使用getline时遇到的问题及解决办法。通过对比不同情况下的程序示例,解释了为什么需要先读取一个空白行以避免跳过实际的输入。

1.如下程序运行

include<iostream>
#include<string>
using namespace std;

int main()
{
  string line;
  for(int i=0;i<2;i++){
  getline(cin,line);
  cout<<line<<endl;
  }
  return 0;
}

[root@promote 20161112]# ./test3
fjaslfjasl
fjaslfjasl
askfaskfaskfjhjk
askfaskfaskfjhjk

运行相当OK!

2.如下程序运行

#include<iostream>
#include<string>
using namespace std;

int main()
{
  string line;
  int a;
  cin>>a;
  for(int i=0;i<2;i++){
  getline(cin,line);
  cout<<line<<endl;
  }
  return 0;
}


[root@promote 20161112]# ./test3
897


fjasfjals
fjasfjals

发什么神经!

3.要改为下面的程序

include<iostream>
#include<string>
using namespace std;

int main()
{
  string line;
  int a;
  cin>>a;
  string haha;
  getline(cin,haha);
  for(int i=0;i<2;i++){
  getline(cin,line);
  cout<<line<<endl;
  }
  return 0;
}

[root@promote 20161112]# ./test3
879
afsjslkafjsakl
afsjslkafjsakl
kajflasjl
kajflasjl


谁能告诉我为什么要提前把空的字符串读走~~~~~~~

### getline函数的基本用法 `getline` 是 C++ 标准库中的一个函数,主要用于从输入流中读取一行数据,直到遇到换行符 `\n` 或者到达文件末尾。它的一个常见原型是: ```cpp istream& getline (istream& is, string& str, char delim); ``` 其中,`is` 是输入流对象,`str` 是用来存储读取到的文本的字符串对象,而 `delim` 是一个可选参数,用来指定行结束符,默认情况下是换行符 `'\n'` [^2]。 ### getline函数的优势 相比于 `cin` 和 `>>` 运算符,`getline` 函数在输入字符串时可以处理包含空格的情况,这使得它在处理用户输入时更加灵活 [^4]。 ### 示例代码 下面是一个使用 `getline` 函数的简单示例: ```cpp #include <iostream> #include <string> using namespace std; int main() { string name; string city; cout << "Please enter your name: "; getline(cin, name); cout << "Enter the city you live in: "; getline(cin, city); cout << "Hello, " << name << endl; cout << "You live in " << city << endl; return 0; } ``` 在这个例子中,`getline(cin, name)` 和 `getline(cin, city)` 分别用来读取用户的姓名和所在城市,这些信息会被存储在 `name` 和 `city` 字符串变量中 [^3]。 ### getline函数的原理 当 `getline` 函数被调用时,它会从指定的输入流中读取字符,直到遇到指定的分隔符 `delim` 或者输入流的末尾。读取到的数据会被存储在 `str` 中,并且函数会返回输入流对象的引用 [^1]。 ### 注意事项 - 在使用 `getline` 函数之前,需要确保已经包含了正确的头文件 `<string>`。 - `getline` 函数会自动处理输入流中的空白字符,并且可以正确读取包含空格的字符串 [^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值