c++ - C++ getline 在 while 循环中缺少第一个字母。没有cin.ignore就不行吗?
问题描述
我已经玩了一个多星期没有成功。它现在的运行方式,它将跳过我的 while 循环第一次迭代的第一个字母。如果我删除cin.ignore()
,下面的代码不起作用。
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main(){
cout << fixed << setprecision(2);
float gpaTot = 0, gpa, clasNum;
int creds;
string clas, cont = "Yes", grade;
while (cont == "Yes"){
cin.ignore();
cout <<"Enter a course name: ";
getline(cin, clas);
cout << clas << endl << "Enter number of credits: ";
cin >> creds;
cout << creds << endl << "Enter your grade (A, B, C, D, F): ";
cin >> grade;
cout << grade << endl << "Continue ('Yes' or 'No')? ";
cin >> cont;
cout << cont << endl;
}
解决方案
将cin.ignore()
调用移动到循环的末尾。
while (cont == "Yes"){
cout <<"Enter a course name: ";
getline(cin, clas);
cout << clas << endl << "Enter number of credits: ";
cin >> creds;
cout << creds << endl << "Enter your grade (A, B, C, D, F): ";
cin >> grade;
cout << grade << endl << "Continue ('Yes' or 'No')? ";
cin >> cont;
cout << cont << endl;
cin.ignore();
}
这样,第一次调用getline
不会跳过一个字母。随后的调用也可以正常工作,因为该行剩余的换行符cin >> cont;
被读取并丢弃cin.ignore()
。
推荐阅读
- powershell - 通过 powershell 脚本更改 Conda 环境(用于 Gitlab-CI)
- javascript - 导出chain promise的返回值
- git - 从工作树提交更改 .git/config 中的远程 url
- angular5 - 如何从ActivatedRoute以角度获取请求正文
- mysql - 使用 spring-boot 和 bitronix JTA 管理器将 XA 数据源配置为 mysql 8 DB 失败并出现 SqlException XAERR_RMERR
- c# - 'readonly' 修饰符是否会创建字段的隐藏副本?
- python - 如何将以下字典键转换为另一个键?
- javascript - 如何重新启动之前调用的屏幕并在本机反应中从后台堆栈中删除前一个屏幕?
- java - AnnotationProcessing - 在每一轮与最后一轮生成文件
- java - 如何更新 Stripe 中的客户默认付款方式?