C++中关于几种输入方法的总结

C++中有很多关于输入的函数,比如cin、cin.get()、cin.getline()、getline()、gets()等等,很容易搞混,下面分别总结下,欢迎补充指正~~

1、cin。它是C++中最基本的输入方法,可以输入数字、字符等,变量是什么类型就接收多少长度,遇到空格、Tab或回车时会终止

#include <iostream>
int main()
{
    using namespace std;
    char a;
    cin >> a;
    cout << a << endl;
}

输入:abc aa

输出:a

2、cin.get()。它是面向字符的输入方法。

  • 如果待输入的对象是字符数组,那么应该是cin.get(字符数组名,接收字符数目),该方法可以接收空格和Tab
#include <iostream>
int main()
{
    using namespace std;
    char a[20];
    cin.get(a,20);
    cout << a << endl;
}

输入:abc abc abc abc abc abc (23个字符)

输出:abc abc abc abc abc (19个字符+1个'\0')

  • 如果带输入的对象是字符变量,那么应该是cin.get(字符变量名):
#include <iostream>
int main()
{
    using namespace std;
    char a;
    cin.get(a);
    cout << a << endl;
}

输入:abc

输出:a

3、cin.getline()。它是面向字符数组的输入方法。它的用法是cin.getline(字符数组名,接收字符数目),该方法可以接收空格和Tab。

#include <iostream>
int main()
{
    using namespace std;
    char a[20];
    cin.get(a,20);
    cout << a << endl;
}

输入:abc abc abc abc abc abc (23个字符)

输出:abc abc abc abc abc (19个字符+1个'\0')

乍一看,cin.getline()和cin.get()好像没区别,但是,当用户输入完毕回车时,cin.getline()不会再在输入缓冲中保存换行符,而cin.get()会(当然,cin也会)。就是说,如果输入一行字符串,如果用cin.getline(),那么当内容输入到变量中后,输入缓冲中也不会有回车符,不会影响下一个输入函数的读取;而如果是cin.get(),那么当内容输入到变量中后,输入缓冲中还会有个回车符,就会影响后面的输入语句。一般可以通过cin.get(字符数组名,接收字符长度).get()的方法,把那个留在输入缓冲中的回车符取出来。

当输入的字符串比分配的空间更长时,cin.getline()和cin.get()会把余下的字符留在输入缓冲中,cin.getline()还会设置失效位,并关闭后面的输入。

4、getline()。它是面向string字符串的输入方法。用法是getline(cin, 字符串名),该方法可以接收空格和Tab。

#include <iostream>
int main()
{
    using namespace std;
    string a;
    getline(cin, a);
    cout << a << endl;
}

输入:ab f

输出:ab f

5、gets()。这个方法编译器提示不安全

6、getchar()。面向字符的输入方法:

#include <iostream>
int main()
{
    using namespace std;
    char a;
    a=getchar();
    cout << a << endl;
}

输入:abc

输出:a

7、strcpy()。这个是面向字符数组的输入方法。此函数不会检查数组越界。

#include <iostream>
int main()
{
    using namespace std;
    char a[3];
    strcpy(a,"affd sfasdfsdf");
    cout << a[5] << endl;
    cout << a << endl;
}

输出:

s

affd sfasdfsdf

这种越界的情况有些编译器会报错的。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Celebi的专栏

C/C++ 学习笔记七(内存管理)

工作中经常使用到C/C++,为对C有个比较深刻的了解,重新拾起学习C的任务。在看书的同时,记录下思考的过程,也记录下重要的知识点。

2680
来自专栏程序员互动联盟

【C语言基础】内存的初始化

我们编写C语言的时候需要给变量申请一块内存区域,当我们创建一个内存区域的时候,内存中的数据十有八九是乱七八糟的(因为其他代码用过后遗留的数据并没有及时清掉) i...

3736
来自专栏机器学习算法与Python学习

10个Python常见面试题,这些弄不明白不要说学过Python!

Python是个非常受欢迎的编程语言,随着近些年机器学习、云计算等技术的发展,Python的职位需求越来越高。下面我收集了10个Python面试官经常问的问题,...

1373
来自专栏小樱的经验随笔

【Python学习笔记之一】Python关键字及其总结

前言 最近在学习Java Sockst的时候遇到了一些麻烦事,我觉得我很有必要重新研究学习Python这种脚本语言,参考大神的经验,淘到了一本学习Python的...

2916
来自专栏Python小屋

使用Python字符串的编码与解码方法实现信息加解密

代码思路很简单,字符串的encode()方法可以将其编码为字节串,在生成的字节串中插入干扰字节后无法正常解码,要想还原信息,必须清楚干扰字节的位置并删除后再使用...

3304
来自专栏LuckQI

学习Java基础知识,打通面试关七

921
来自专栏吴裕超

exports 和 module.exports 的区别

require 用来加载代码,而 exports 和 module.exports 则用来导出代码。但很多新手可能会迷惑于 exports 和 module.e...

2854
来自专栏栗霖积跬步之旅

1.7停止线程

线程停止:在线程处理完任务之前,停掉正在做的操作,也就是放弃当前操作。 在java中有三种方法可以实现线程的停止: 使用退出标志,使线程正常退出,也就是当run...

2040
来自专栏java学习

java每日一练(2017/8/11)

(单选题) 1、关于下面的程序Test.java说法正确的是( )。 publicclass Test { staticString x="1"; sta...

2806
来自专栏MasiMaro 的技术博文

C++继承

在封装的过程中,我们发现有很多地方有问题,比如我们在封装Windows API 的过程中,每个窗口都有各自的消息处理,而我们封装时不同的窗口要针对不同的消息而编...

852

扫码关注云+社区

领取腾讯云代金券