cin.getline()的用法和坑
cin.getline大致原型:istream& getline (char\* s, streamsize n, char delim='\n'),其中s是字符串的首地址,n是输入长度,delime是定界符(缺省是\n)

我们首先来考虑一个实际的问题,代码如下

  1. char ch[10];
  2. cin.getline(ch,10);

如果我们输入为"0123456789",ch[10]里面的数据存储应该为"012345678\0",因为我们输入的字符串实际上是"0123456789\n",这里很显然是超出了输入长度,cin.getline()会发生数据截断。正确的极限输入应该是"012345678\n",getline()将'\n'替换成'\0',此时缓冲区没有'\n',('\n'被cin.getline吃了,消化成了'\0').

我们再来考虑如下的情形:

  1. char ch[10];
  2. cin.getline(ch,12);

如果我们输入的是"0123456789a\n",一共12个字符,包括'\n'(这是极限输入),但是ch[10]里面的值是"0123456789"

结论如下

cin.getline()会根据参数对输入产生截断,不考虑ch的存储空间,先将输入转换为"xxxx\0"的格式,然后将前到后赋给ch(原理应该是这样子的),所以ch中不一定有'\0'

那么,如何科学的使用cin.getline()呢?

如果字符串是不超过i个大小,那么我们应该定义ch[i+1],为'\0'预留一个空间,此时我们应该使用cin.getline(ch,j),此时应该满足j>=i+1包括i个数据和'\0'.

  1. // 如果要求不超过100个数据,应该如下定义
  2. char ch[101]; // 包括100个数据和一个'\0'
  3. cin.getline(ch,101) // 包括100个数据和一个'\0'

cin.getline()的用法和坑的更多相关文章

  1. c++之cin/cin.get/cin.getline()详解

    C++输入过程中,是把输入加载到缓冲区中,然后对缓冲区中的字符进行读取.cin,cin,get(),cin.getline()三个函数虽然都能进行数据读取,但是它们对缓冲区内数据的处理方法是不同的(如 ...

  2. 日常笔记4关于cin、cin.get()、cin.getline()、getline()使用区别

    1.关于PAT中段错误 使用字符数组出现错误: char str[256]; 报错段错误,然后改用C++中的string 改成: string str; 同char数组一样,也可以使用下标来取单个字符 ...

  3. C++中几个输入函数的用法和区别(cin、cin.get()、cin.getline()、getline()、gets()、getchar())

    1.cin>> 用法1:最基本,也是最常用的用法,输入一个数字: #include <iostream>using namespace std;main (){int a,b; ...

  4. cin 与 getchar 中的坑

    今天在一道题上发现一个坑. 输入三个字符,按以下规则求其平均值. (1)如果是数字0~9,那么直接参与求值: (2)如果是其他字符,则其ASCII码参与求值. 输入 输入数据有多组.第一行是数据的组数 ...

  5. cin, cin.getline等函数

    char s[100]; cin>>s;         // 输入一个字符串,遇“空格”.“TAB”.“回车”都结束 cin.getline(s, 20);    // cin.get( ...

  6. [原创]cin、cin.get()、cin.getline()、getline()、gets()、getchar()的区别

    这几个输入函数经常搞不清具体特点和用法,这里稍作总结 一.cin>> 1.最基本用法,输入一个变量值 2.输入字符串,遇“空格”.“TAB”.“回车”结束,比如输入“hello world ...

  7. C++中关于cin、cin.get()、cin.getline()、getline()、gets()等函数的用法

    1.cin>> 用法1:最基本,也是最常用的用法,输入一个数字: 注意:>> 是会过滤掉不可见的字符(如 空格 回车,TAB 等) cin>>noskipws> ...

  8. C++语言中cin cin.getline cin.get getline gets getchar 的用法实例

    #include <iostream> #include <string> using namespace std; //关于cin cin.getline cin.get g ...

  9. C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法----细节决定成败 (sort用法)

    C++中cin.cin.get().cin.getline().getline().gets()等函数的用法 学C++的时候,这几个输入函数弄的有点迷糊:这里做个小结,为了自己复习,也希望对后来者能有 ...

随机推荐

  1. jquery关于checkbox复选框是否被选中的问题

    本人在项目中需要用到,判断哪些复选框被用户选中.自然而然想到用 if($('').attr('checked') == true) 但是不管有没有选,$('').attr('checked')返回的都 ...

  2. 【Java】macOS下编译JDK8

    安装mercurial brew install mercurial 下载源码 1234 hg clone http://hg.openjdk.java.net/jdk8/jdk8 java-sour ...

  3. webpack插件

    插件 plugins:[ new ExtractTextPlugin.extrct({ }) //创建html new HtmlWebpackPlugin({ title:"first pa ...

  4. 疫情期,如何用A/B测试快速迭代你的产品?

    作者:友盟+数据科学家 杨玉莲.陆子骏 冠状病毒来袭牵动着每个人的心,但是病毒影响的不仅仅是我们的健康,也以极快的速度极深远地影响了整个移动互联网的发展.主流阵地原本在线下的需求,如医疗和生鲜电商,快 ...

  5. Python开发(三):字符编码,文件操作,函数

    一:三级菜单 If len(choice) == continue # 判断输入的是否为空,为空就跳出这次循环进行下次循环, exit(“bye”) :退出程序显示,bye 二:编码 最早的编码是as ...

  6. node--静态文件托管,路由,模板引擎

    1.路由 路由是由一个URI和一个特定的HTTP方法(GET/POST)组成的 涉及到应用如何响应客户端对某个网站节点的访问 2.ejs 3.get/post 1)get获取数据 通过Url类中的qu ...

  7. 利用ajax 引入静态页公共的头部与底部

    利用ajax引入公共的头部与底部或者多个页面需要用到的重复的组件,对于新入门的前端来说是很实用的方法,自己也是新手菜鸟一枚,折腾了好久,实现的方法有很多种,这是我个人觉得比较简单方便的 首先得把公用的 ...

  8. ES6拓展的对象功能

    前言:因为之前看过很多的博客啊,书籍啊但是最后都雁过无痕,再问我基本没什么印象,所以就迫使自己看书的时候记点笔记,因为懒得写字[捂脸],现在是打字比写字要快好多,所以就写博客吧! ES6规范明确定义了 ...

  9. 织梦cms文章内容页上下篇单独获得URL和文章名称修改

    1.打开/include/arc.archives.class.php ,查找   $this->PreNext['pre']    //约813行 在其下一行插入: $this->Pre ...

  10. 配置ubunto 流量使用限制 python 实现简单 http server

    很多ubunto 都有流量限制,使用流量.如每天使用200M ,超过了就要提示信息 原理,在本机 开一个 http 服务, 显示错误信息,哪流量使用完以后,使用 iptables 将 流量转发到 本机 ...