zoukankan      html  css  js  c++  java
  • C++:cin、cin.get()、cin.getline()、getline()、gets()的用法(修改http://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html)

    C++中有两个getline函数,这两个函数分别定义在不同的头文件中

    1、getline()是定义在<string>头文件中,功能是取一行字符串,读到换行符结束,并且抛弃换行符。

    具体用法见下面代码(摘自http://bbs.csdn.net/topics/320157488):

    方法1:
    #include<string>
    string str_demo;
    getline(cin,str_demo,'char');
    'char'是一个字符,默认下是' '(回车键),它的意思是从键盘中输入字符串存入str_demo中,并且遇到字符'char'(默认是回车键) 字符串str_demo就停止从键盘读取了。
     
    如果换成
    #include<fstream>
    ifstream infile("text.txt");
    getline(infile,str_demo)    //默认遇到回车键停止读取
    就代表从文件text.txt中读取字符串,直到遇到换行符(回车键)为止;
     
     
    方法2:
    char str_demo[256];
    cin.getline(str_demo,256,'char')
    char的意义同上。它的意思是往字符串数组str_demo[256]中存入最多256个字符。
    同样,cin也可以和方法1一样改成infile的。


     
    2、gets()在C++中是定义在<iostream>头文件中或在C语言中定义在<stdio.h>头文件中,用哪个都可以(在VS2012上已测试,因为有人说C++中没有定义gets。本人测试C++没有定义get()函数,get()函数的头文件是<stdio.h>)。功能为输入一行字符串,遇到换行符将换行符转换为null值,并由此来结束字符串。(不同于cin.get())

    C语言定义:
    (1)函数:gets(字符指针)    
    (2)头文件:string.h(c中),c++不需包含此头文件    
    (3)原型:char *gets( char *buffer );    
    (4)功能:从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。    
    (5)注意:本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到缓冲区后面的内存位置,这将破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序。    

    示例:

    #include"stdio.h"
    void main()
    {
      char str1[5];
      gets(str1);
      printf("%s ",str1);
    }

    C++用法同C语言 :
      gets(s)(其中s为字符串变量)函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃。gets(s)函数与scanf("%s:",&s)相似,但不完全相同,使用scanf("%s",&s);函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。
    示例:
    #include<iostream>
    using namespace std;
    int main()
    {
      char str[100];
      gets(str);
      cout<<str;
      return 0;
    }
    说明:gets(s);函数中的变量s为一字符串。如果为单个字符,编译连接不会有错误,但运行后会出现”Null pointer asignment"的错误
     
    3、cin.getline()是cin的一个成员函数,定义在<iostream>头文件中,该函数有两个参数,第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数,如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符,getline()成员函数在读取指定数目的字符或遇到换行符就停止读取,并抛弃换行符。如cin.getline(name, 20);

    #include <iostream> 
    using namespace std; 
    main () 

    char m[20]; 
    cin.getline(m,5); 
    cout<<m<<endl; 
    }

    输入:jkljkljkl 
    输出:jklj

    接受5个字符到m中,其中最后一个为'',所以只看到4个字符输出;

    如果把5改成20: 
    输入:jkljkljkl 
    输出:jkljkljkl

    输入:jklf fjlsjf fjsdklf 
    输出:jklf fjlsjf fjsdklf

    //延伸: 
    //cin.getline()实际上有三个参数,cin.getline(接受字符串的看哦那间m,接受个数5,结束字符) 
    //当第三个参数省略时,系统默认为'' 
    //如果将例子中cin.getline()改为cin.getline(m,5,'a');当输入jlkjkljkl时输出jklj,输入jkaljkljkl时,输出jk

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

    #include<iostream> 
    #include<string> 
    using namespace std;

    main () 

    char m[3][20]; 
    for(int i=0;i<3;i++) 

    cout<<" 请输入第"<<i+1<<"个字符串:"<<endl; 
    cin.getline(m[i],20); 
    }

    cout<<endl; 
    for(int j=0;j<3;j++) 
    cout<<"输出m["<<j<<"]的值:"<<m[j]<<endl;

    }

    请输入第1个字符串: 
    kskr1

    请输入第2个字符串: 
    kskr2

    请输入第3个字符串: 
    kskr3

    输出m[0]的值:kskr1 
    输出m[1]的值:kskr2 
    输出m[2]的值:kskr3

    4、cin.get()有两种方式,第一种跟cin.getline()类似,它们接受的参数相同,解释参数的方式也相同,并且都读到行尾,但是get不在读取并抛弃换行符,而是将其留在输入队列中。如果执行完一个cin.get(name, size)后,再用cin.get(name, size)时,则不会读新的一行,只会读取换行符;第二中方式就是cin.get()没有参数,该功能读取一个字符,包括换行符。cin.getline(name, 20);跟cin.get(name, 20);cin.get();效果一样。

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

    #include <iostream> 
    using namespace std; 
    main () 

    char ch; 
    cin.get(ch);               //或者ch=cin.get()

    cout<<ch<<endl; 
    }

    输入:jljkljkl 
    输出:j

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

    #include <iostream> 
    using namespace std; 
    main () 

    char a[20]; 
    cin.get(a,20); 
    cout<<a<<endl; 
    }

    输入:jkl jkl jkl 
    输出:jkl jkl jkl

    输入:abcdeabcdeabcdeabcdeabcde (输入25个字符) 
    输出:abcdeabcdeabcdeabcd              (接收19个字符+1个'')

    用法3:cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者判断输入字符串是否比目标数组长。

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

    输入:abcd

    显示:abcd 

             love

    解释:就是没有提示第二次输入就跳过了,这是因为第一次输入后的换行符没有被抛弃,被下个cin.get()读取了。可以在第一次输入后再加上cin.get()释放换行符。

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

    输入:abcd

    显示:abcd

    再次输入:fgh

    显示:abcd

             fgh

             love

    5、cin>>:特别注意输入字符串时,遇“空格”、“TAB”、“回车”都结束。

    用法1:最基本,也是最常用的用法,输入一个数字:

    #include <iostream> 
    using namespace std; 
    main () 

    int a,b; 
    cin>>a>>b; 
    cout<<a+b<<endl; 
    }

    输入:2[回车]3[回车] 
    输出:5

    注意:>> 是会过滤掉不可见字符(如 空格 回车,TAB 等) 
    cin>>noskipws>>input[j];//不想略过空白字符,那就使用 noskipws 流控制

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

    #include <iostream> 
    using namespace std; 
    main () 

    char a[20]; 
    cin>>a; 
    cout<<a<<endl; 
    }

    输入:jkljkljkl 
    输出:jkljkljkl

    输入:jkljkl jkljkl       //遇空格结束 
    输出:jkljkl

  • 相关阅读:
    Android——继续深造——从安装Android Studio 2.0开始(详)
    PHP——安装wampserver丢失MSVCR110.dll
    Marza Gift for GDC 2016
    Retrieve OpenGL Context from Qt 5.5 on OSX
    Space Time Varying Color Palette
    Screen Space Depth Varying Glow based on Heat Diffusion
    Visualization of Detail Point Set by Local Algebraic Sphere Fitting
    Glass Dragon
    Jump Flood Algorithms for Centroidal Voronoi Tessellation
    京都之行
  • 原文地址:https://www.cnblogs.com/wangxiaochu/p/4432142.html
Copyright © 2011-2022 走看看