c语言文件缓冲区(C++缓冲区scanf,getline,cin问题)
导读:/* * @Author: DEFT:errornotfound@qq.com V:NOTFOUND6O6 *...
/*
* @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 缓冲区 清除回车符创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!