首页IT科技c语言文件缓冲区(C++缓冲区scanf,getline,cin问题)

c语言文件缓冲区(C++缓冲区scanf,getline,cin问题)

时间2025-08-05 03:49:18分类IT科技浏览4501
导读:/* * @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版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
hibernate执行流程(Hibernate执行查询后又立马执行了更新(defaultaccess))