/*
* @Author: DEFT:errornotfound@qq.com V:NOTFOUND6O6
* @Date: 2023-02-22 19:02:35
* @LastEditors: Please set LastEditors
* @LastEditTime: 2023-02-22 20:19:47
* @FilePath: \WenkaiC\book.cpp
* @Description:
*
* Copyright (c) 2023 by 1zPeasy, All Rights Reserved.
*/
#include <iostream>
using namespace std;
struct Books{
string name;
double price;
};
int main() {
int n;cin >> n;
cout << "输入的数量为:" << n << endl;
struct Books b[n];
for(int i=0; i < n; i++){
//char ch;scanf("%c", &ch);
cin.ignore(1024, '\n');
getline(cin,b[i].name);
cin >> b[i].price;
}
for(int j=0; j<n; j++){
cout << b[j].name << endl;
cout << b[j].price << endl;
}
return 0;
}
个人理解
回车换行符:回车键
当我们输入2回车的时候,实际上是先在键盘的键盘缓冲区中缓冲了 2\r\n,然后再发送到缓冲区中。然后第一个cin读取到2,然后再读到一个非数字(\r)后结束,赋值给n,但是此时的回车换行符还在缓冲区中。但是此时在没清空的情况下,又进行getline()函数等待输入,此时我们在键盘中又开始输入"math"回车,发送到缓冲区中。此时缓冲区中有用 \r\nmath,getline()函数读取到\r\n结束,把前面的内容存放到b[0].name,回车符也被读出扔掉;然后继续下一个cin,这个时候cin读取到缓冲区中math,m放double类型的price时,类型不匹配,复制失败,所有b[0].price就是默认值0。然后进行第二次循环__?____。
解决方法
原理:为什么能达到和cin.ignore类型的作用呢?
char ch;scanf("%c", &ch);
或者
原理:cin.ignore(a,ch)方法是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。
cin.ignore(1024, '\n');
参考文章
【C/C++】scanf()函数用法详解(缓冲区、格式控制、fflush)
cin.ignore()函数的用法
C++中关于 getline() 读取缓冲区中回车,以及cin 结束符的问题
【令人烦恼困惑的scanf (共5集)】 【精准空降到 15:09】
\r \n 回车换行符详解
getchar scanf 缓冲区 清除回车符