我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++字符串输入缓冲区机制详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++字符串输入缓冲区机制详解

一、缓冲定义

1.缓冲定义

缓冲是在两种不同速度设备之间传输信息时平滑传输过程的常用手段。

2.为什么引入缓冲区

操作系统这门课有明确的说明缓冲的作用,是为了解决高速设备和低速设备之间速度不匹配的问题,直接举个书上的CPU和打印机的例子:

首先我们要用打印机打印一篇文章肯定要经过CPU处理然后给到打印机打印文章,但是CPU处理1000个字节的文字一眨眼的事情,但是打印机可能需要若干秒,总不可能让CPU处理一个数据给打印机一个数据这样子等着运行,这就引入了缓冲区,CPU处理完数据存入缓冲区,打印机直接从缓冲区提取已经处理好的数据,这样子就解决了高速设备(CPU)和低速设备(打印机)处理速度不匹配的问题。

二、scanf,cin输入缓冲区

1.scanf和cin的缓冲类型

scanf和cin的缓冲类型为行缓冲,行缓冲的的特点是在输入数据只要没有碰到换行符(回车)就将数据存入输入缓冲区,当碰到换行符之后就将缓冲区中的数据取出使用。

2.scanf和cin的缓冲机制

scanf和cin输入数据缓冲机制基本一致,在读入一个数据时直到回车之前他都会存储在输入缓冲区中,直到碰到回车才会将数据从输入缓冲区中取出供变量使用,但是缓冲区中的换行符会被留在输入缓冲区中。

3.cin.getline和cin.get

cin.get读取字符串直到读取到回车为止,但是也会将回车留在缓冲区。

cin.getline读取字符串直到读取到回车为止,但是不会讲回车留在缓冲区。

4.scanf和cin输入

①cin和scanf读取一个字符的区别


	char c;
	cin>>c;//cin读取字符的时候不会读入空格、回车以及制表符,如果缓冲区开头是换行符或者制表符会被忽略并清除
	scanf("%c",&c);//scanf读取字符的时候不会管你是什么字符直接读进来

②cin和scanf在读取缓冲区中的数字、字符串、浮点型的时候不会将开头的空格、换行符或者制表符当作数据读入,如果碰到了他们会将它们忽略并清除。需要注意cin.get和cin.getline不会将开头的空格、换行符或者制表符忽略并删除。

5.可能遇到的问题

①在用cin或者scanf读取一个字符串之后scanf再读取一个字符,发现读取的字符没办法输入而且输出了一个回车。看如下代码:


	char name[20];
    char c;
    cin>>name;
    cout<<name<<endl;
    scanf("%c",&c);
    cout<<"---"<<int(c)<<endl;

结果如下截图:

在这里插入图片描述

当我们输入name为123的时候程序就结束了输出c的值为10,在ASCII码编码中10对应的是换行符,为什么会出现上述这种情况呢?因为cin输入完之后将回车保留在了缓冲区中,而scanf("%c",&c)输入字符并不会判断是空格还是回车,直接将缓冲区中的回车拿了出来给了字符变量c。

②用cin.getline输入字符串之后再用scanf读取一个字符就和上面不一样了。看如下代码:


	char name[20];
    char c;
    cin.getline(name,20);
    cout<<name<<endl;
    scanf("%c",&c);
    cout<<"---"<<int(c)<<endl;

结果如下截图:

在这里插入图片描述

结果不同的原因是因为scanf,cin,cin.get在行缓冲取出数据之后会将换行符留在缓冲区中,然后再用scanf读入一个字符发现缓冲区并不为空就从缓冲区中将数据拿出来,而cin.getline会将缓冲区中的换行符也清除,所以不会有①这种情况出现。

③读入一个字符串之后后面的cin.get()一直无法读取数据,看如下代码:


	char name[20];
    cin.get(name,20);
    cout<<"--"<<name<<endl;
    cin.get(name,20);
    cout<<"--"<<name<<endl;
    cin.get(name,20);
    cout<<"--"<<name<<endl;
    cin.get(name,20);
    cout<<"--"<<name<<endl;
    cin.get(name,20);
    cout<<"--"<<name<<endl;

结果如下截图:

在这里插入图片描述

可以看到用第一个cin.get输入了数据之后后面的cin.get都无效了,这是因为cin.get从缓冲区中读取到换行符就结束并将换行符保留在缓冲区中,接下来的cin.get一直在缓冲区中碰到换行符就一直没有实际数据输入。

④整形和字符串混合输入

当先输入一个整形再用cin.getline输入字符串会发现没有经历输入字符串的过程,测试如下代码:


	char name[20];
    int a;
    cin>>a;
    cout<<a<<endl;
    cin.getline(name,20);
    cout<<"---"<<name<<endl;
    cout<<"end"<<endl;

结果如下:

在这里插入图片描述

根据上面的缓冲原理比较容易理解,cin输入一个整形后会在缓冲区中留下一个换行符,因为缓冲区中有换行符剩余,cin.getline从缓冲区中取出数据发现正好是换行符,那么就默认字符串输入完了,并将换行符从缓冲区中去掉,所以造成了上面的局面。

清除缓冲区

上面讲的问题基本上都是因为缓冲区中剩余的数据造成的,那么只需要有方法清除缓冲区就行了,可以用getchar(),cin.get()读取缓冲区中多的换行符。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++字符串输入缓冲区机制详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何理解C++字符串输入缓冲区机制

这篇文章主要讲解了“如何理解C++字符串输入缓冲区机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解C++字符串输入缓冲区机制”吧!一、缓冲定义1.缓冲定义缓冲是在两种不同速度设备之
2023-06-25

oracle字符串缓冲区太小如何解决

如果在Oracle中使用字符串缓冲区时遇到了缓冲区太小的问题,可以尝试以下方法来解决:1. 使用更大的缓冲区大小:可以通过增加初始化参数DB_BLOCK_BUFFERS或DB_CACHE_SIZE来增加整个数据库的缓冲区大小。2. 增加单个
2023-10-18

ORA-06512数字或值错误字符串缓冲区太小异常详解

ORA-06512 网上最容易查到的解释为CauseThis error is caused by the stack being unwound by unhandled exceptions in your PLSQL code.T
2023-01-13

c字符串,string对象,字符串字面值的区别详解

以下是对c字符串,string对象,字符串字面值的区别进行了详细的介绍,需要朋友可以 过来参考下
2022-11-15

一文搞定Java IO流,输入流、输出流、字符流、缓冲流,附详细代码示例

目录 一、InputStream1、FileInputStream的代码示例2、ByteArrayInputStream的代码示例3、PipedInputStream的代码示例 二、 OutputStream1、FileOu
2023-08-16

详解Python中神奇的字符串驻留机制

字符串驻留机制是Python针对字符串对象采取的一种内存优化技术。其目标是减少内存使用并提高程序的性能。这篇文章主要介绍了字符串驻留机制的简单应用,需要的可以参考一下
2023-05-14

Android Secret Code(输入字符弹出手机信息)详解

Android Secret Code 我们很多人应该都做过这样的操作,打开拨号键盘输入*#*#4636#*#*等字符就会弹出一个界面显示手机相关的一些信息,这个功能在Android中被称为android secret code,除了这些系
2022-06-06

深入理解Go语言中的字符串拼接机制

在Go语言中,字符串拼接是开发中经常会遇到的操作。了解Go语言中的字符串拼接机制,能够帮助我们更好地理解其内部工作原理,并有效地优化代码性能。本文将深入探讨Go语言中的字符串拼接机制,并给出具体的代码示例。在Go语言中,字符串是不可变的。
深入理解Go语言中的字符串拼接机制
2024-03-12

C语言如何根据指定的格式解析来自一个字符串的输入

C语言根据格式解析字符串输入,使用sscanf函数。格式字符串指定输入格式,变量列表存储解析结果。函数返回成功解析的项数。示例演示了姓名、年龄、工资解析。注意事项包括格式匹配、占位符顺序和输入不变。扩展功能包括宽度限定、跳过字符、提取匹配项,以增强解析控制。
C语言如何根据指定的格式解析来自一个字符串的输入
2024-04-02

C++中获取字符串长度的函数sizeof()、strlen()、length()、size()详解和区别(推荐)

在C++中计算长度的函数有四种,它们分别是sizeof() ,size(),strlen(),str.length(),这篇文章主要介绍了C++中获取字符串长度的函数sizeof()、strlen()、length()、size()详解和区别,需要的朋友可以参考下
2023-02-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录