• 如果您想对本站表示支持,请随手点击一下广告即可~
  • 本站致力于提供原创、优秀的技术文章~
  • 有任何疑问或建议 均可以在站点右侧栏处 通过各种方式联系站长哦~
  • C++的六种常用输入

    C/C++ EXP 161阅读 0评论

    cin

    用法1: 最基本,也是最常用的用法,输入一个数字或字符(不接受空字符作为字符输入,当输入字符为空字符时,会不断重复要求输入,直至输入字符非空后,通过回车结束输入):


    用法2: 接受一个字符串,遇“空格”、“TAB”、“回车”都结束:


    cin.get()

    用法1: cin.get(字符变量名) 可以用来接收字符:


    用法2: cin.get(字符数组名,串长) 用来接收一行字符串,可以接收空格:

    注: cin.get (char对象地址,串长)
      cin.get()只能和char(或char*)定义的字符串地址搭配,不能和string定义的字符串地址搭配


    用法3: cin.get(无参数)

    没有参数,主要是用于舍弃输入流中的不需要的字符,多用于舍弃前一次输入时放在输入缓冲区的回车。

    注:
      此用法会在“附页一”通过比较cin.get()与cin.getline()的不同详细而举例说明


    cin.getline()

    用法1: 接受一个字符串,可以接收空格并输出:

    如果把5改成20:


    用法2: 当用在多维数组中的时候,也可以用cin.getline(m[i],20)之类的用法:

    注: cin.getline()功能的扩展说明
      cin.getline()实际上有三个参数,cin.getline(char对象地址,串长,’结束字符’)
      ① 当第三个参数省略时,系统默认为’\0′
      ② 如果把例子中cin.getline()改为cin.getline(m,5,’a’);
        当输入jlkjkljkl时,输出jklj ; 输入jkaljkljkl时,输出jk
      ③ cin.getline()至少要有前2个参数,且只能和char(或char*)定义的字符串地址搭配,不能和string定义的字符串地址搭配


    getline()

    只有一种用法:接受一个字符串,可以接收空格并输出(需 #include <string>):

    注:
      ① getline()和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数。
      ② getline(cin,string对象地址) 中的字符串地址只能和string定义的字符串地址搭配,不能和char(或char*)定义的字符串地址搭配。这与cin.getline()相反。


    gets()

    用法1: 接受一个字符串,可以接收空格并输出(需 #include <string>):

    注:gets(char对象地址)
      gets()只能和char(或char*)定义的字符串地址搭配,不能和string定义的字符串地址搭配


    用法2: 类似cin.getline()里面的一个例子,gets()同样可以用在多维数组里面:


    getchar()

    只有一种用法:接受一个字符(需 #include <string>):

    注:
      getchar()是C语言的函数,C++也可以兼容,但是尽量不用或少用


    附页一: cin.get()与cin.getline()的异同

    相同点: cin.get ()和cin.getline()都是对输入的面向行的读取,即一次读取整行而不是单个数字或字符。


    不同点一: cin.get()每次读取一整行并把由Enter键生成的换行符留在输入队列中,如:

    输出:

    在这个例子中,cin.get()将输入的名字读取到了name中,并将由Enter生成的换行符’/n’留在了输入队列(即输入缓冲区)中,因此下一次的cin.get()便在缓冲区中发现了’/n’并把它读取了,最后造成第二次的无法对地址的输入并读取了换行符。

    解决方法:
      ① 可以在源程序两次调用cin.get()之间再加入一个cin.get();语句,把第一次输入的换行符’\n’吃掉,一般为了易读性应该在第一次调用cin.get()函数输入后,马上再添加一个cin.get();语句。
      ② 可以把第一次调用的cin.get()函数组合式地写为cin.get(name,SIZE).get();直接吃掉换行符


    不同点二: cin.getline()每次读取一整行并把由Enter键生成的换行符抛弃,如:

    输出:

    在这个例子中,由于由Enter生成的换行符被抛弃了,所以不会影响下一次cin.get()对地址的读取


    附页二: getline()函数 -> FIFO的队列问题

    先看看函数定义:

    显然,这个函数接受两个参数:一个输入流对象和一个string对象。

    getline函数从输入流的下一行读取,并把上一次读取的内容保存到string中(但不包括换行符)。和输入操作符不一样的是,getline并不忽略行开头的换行符,只要getline遇到换行符,即便它是输入的第一个字符,getline也停止读入并返回。如果第一个字符就是换行符,则string参数将被置为空。

    由于getline函数返回时丢弃换行符,因此换行符不会存储在string对象中。当在循环中时若要逐行输出,需要再额外添加换行符,通常用endl,换行的同时刷新输出缓冲区。

    可以通过队列去理解getline的功能:

    • 第一次输入时,信息流1被存放到cin缓冲区中(cin是缓冲式输入,而且这里的cin也不能指定存放对象,因而信息流1被存放到缓冲区)。
    • 第二次输入时,信息流1被string对象读取并保存,信息流2被寄存到cin缓冲区。
    • 第三次输入时,信息流2被string对象读取并保存,信息流1被信息流2所覆盖,信息流3被存放到cin缓冲区。

    由此也可以解释为什么类似于这种程序需要在输入信息流后按两次回车才执行输出了:

    如:输入abcd,第一次回车,abcd被存放到输入缓冲区,此时程序仍然停留在执行语句getline(cin,str);中,第二次回车,abcd被str读取保存,空字符(回车符)被送到输入缓冲区,然后getline(cin,str);执行完毕,跳到cout语句,输出str: abcd。

    以下这个小程序在第一次调用getline(cin,line)时需要输入2个信息流,以后每输入新的信息流,最就会输出上一次输入的信息流,可以体验一下什么是队列:


    资源下载

    本文全文下载


    转载请注明:EXP 技术分享博客 » C++的六种常用输入

    喜欢 (0) 分享 (0)
    发表我的评论
    取消评论

    表情

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址