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

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

时间2025-06-14 00:19:49分类IT科技浏览4029
导读:/* * @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
可变参数的作用是什么(泛化之美 —— C++11 可变参数模板的妙用) vue框架前后端分离(vue框架前后端联调流程)