精华内容
下载资源
问答
  • 2022-04-10 01:45:48

     1.cin.getline()函数cin.getline(字符数组名,字符个数,结束标志),结束标志可以省略,碰到回车就会停止。
      cin.getline()可以接收空格,直到碰到回车才停止,所以会读取n-1个元素。

    #include <iostream>
    using namespace std;
    int main() {
      char a[100] ;
    cout<<"输入的值为:"<<end;
        cin.getline(a, 10);
        for(int i = 0; i<10;i++)
        cout << "输出的值:"<<a[i]<< endl;
        return 0;
    }
    

    用户端输入的字符不足给定的元素个数,则只截取用户的元素,如果用户端输入的字符数目大于给定的,则按照给定的数目截取,空格也算在内。

    结果:

    D:\untitled19\cmake-build-debug\untitled19.exe
    输入的值:1 2 3456789
    输出的值:
    1
    
    2
    
    3
    4
    5
    6
    7
    
    
    Process finished with exit code 0
    

    2.(1) getline()函数getline(cin, str)  将输入流保存到str中去,过程中空格也一并接收可读取整行,

    包括前导和嵌入的空格,并将其存储在字符串对象中。

    #include <iostream>
    #include <string> //来导入标准库中的字符串类和相关操作,导入后才能使用string类
    using namespace std;
    int main()
    {
        string name;
        string city;
        cout << "Please enter your name: ";
        getline(cin, name);
        cout << "Enter the city you live in: ";
        getline(cin, city);
        cout << "Hello, " << name << endl;
        cout << "You live in " << city << endl;
        return 0;
    }

    运行结果:

    D:\untitled39\cmake-build-debug\untitled39.exe
     Please enter your name: jan
     Enter the city you live in: Beijing
     Hello, jan
    You live in Beijing
    
    Process finished with exit code 0
    

      (2) 当同时使用cin和getline时,在输入流cin结束后需要清空缓存,否则下一个读入的并不是用户的输入而是一个回车。 例如:

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

    运行结果:

    D:\untitled39\cmake-build-debug\untitled39.exe
    5
    
    
    Process finished with exit code 0
    

    输入流赋值给a后,本想通过getline获取c,却没有机会再进行输入了,这是因为cin之后的回车交给了c, 程序结束

     解决方法是插入一个函数用来接收\n,然后再调用自己的getline函数来接收之后的string c;

    测试结果: 

    D:\untitled39\cmake-build-debug\untitled39.exe
    2
    b
    b
    
    Process finished with exit code 0
    

    更多相关内容
  • 下面先看下C++ cin.getline用法,具体内容如下所示: 使用 C++ 字符数组与使用 string 对象还有另一种不同的方式,就是在处理它们时必须使用不同的函数集。例如,要读取一行输入,必须使用 cin.getline 而不是 ...
  • 之前在使用C++中的getline读取文本文件时由于没有仔细看getline的定义,导致出了错:在读取文本文件时未读取到文件中的第一行。 错误的源代码如下: vectorreadfile(string s1,vectorv1) { ifstream infile...
  • getline()用法 getline是C++标准库函数;它有两种形式,一种是头文件中输入流成员函数;一种在头文件中普通函数; 它遇到以下情况发生会导致生成的本字符串结束: (1)到文件结束,(2)遇到函数的定界符,(3)输入达到...
  • 详解C++ cin.getline函数

    2020-12-16 22:44:56
    cin 虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题。 当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。一旦它接触到第一个非空格字符即开始阅读...
  • import linecacheprint linecache.getline(‘2.1_open.py’, 4)将返回我上一节事例代码文件2.1_open.py的第4行文字,输出结果:f = open(‘/home/evergreen/桌面/test’)查看linecache中的实现(我用的是Ulipad,...
  • getline是C++标准库函数;但不是C标准库函数,而是POSIX(IEEE Std 1003.1-2008版本及以上)所定义的标准库函数(在POSIX IEEE Std 1003.1-2008标准出来之前,则只是GNU扩展库里的函数)。getline会生成一个包含一串...
  • 学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结
  • C++ get()函数读入一个字符 get()函数是cin输入流对象的成员函数,它有3种形式:无参数的,有一个参数的,有3个参数的。 1) 不带参数的get函数 其调用形式为 cin.get() 用来从指定的输入流中提取一个字符(包括...
  • 我在网上搜了半天getline()函数,大多针对C++的,重载函数比较多,云里雾里的,而且没有实例,反正就是没有自己所需要的getline()函数。所以,自己在Linux下man了一把,并做了测试。getline()函数的功能是从文件中...
  • 最原始的方法: 获取输入流最原始的形式就是cin>>(type) ,但是这种...getline()方法读取整行,他使用通过回车键输入的换行符来中断,getline()方法有两个参数,第一个参数用来存储输入行的数组的名称,第二个参数用
  • 最近使用C++中自己老是忘记的一个点,get与getline的区别。 1、get与getline get和getline所属iostream类,作用是读取一整行,通过换行符确定读取结束,他们都可以读取空格。 2、get与getline区别 getline会在读取...
  • cin.getline()和cin.get()都是对输入的面向行的读取,即一次读取整行而不是单个数字或字符,但是二者有一定的区别。cin.get()每次读取一整行并把由Enter键生成的换行符留在输入队列中,比如: 代码如下:#include ...
  • getline

    2022-05-01 21:00:55
    getline getline源码,根据源码编写自己的getline函数,只保留核心功能,。 #define GETDELIM_GROWBY 64 /** * @brief 读取一行数据 * * @param lineptr 数据存放缓冲区 * @param n lineptr的大小 * @param ...

    getline

    getline源码,根据源码编写自己的getline函数,只保留核心功能,。

    #define GETDELIM_GROWBY		64
    
    /**
     * @brief 读取一行数据
     *
     * @param lineptr 数据存放缓冲区
     * @param n lineptr的大小
     * @param stream
     * @return ssize_t 成功返回读取到的数量,失败返回-1
     */
    ssize_t mygetline( char **lineptr, size_t *n, FILE *stream )
    {
    	register char *buf; /*设置寄存器变量,加快访问速度*/
    	ssize_t pos;
    	int c;
    
    	if( !lineptr || !n || !stream ) /*传入的参数为null*/
    	{
    		fprintf( stderr,"%d : arg is null", __LINE__ );
    		return -1;
    	}
    	else
    	{
    		/*如果lineptr传递为null,那么设置大小为0*/
    		if( !( buf = *lineptr ) )
    		{
    			*n = 0;
    		}
    
    		pos = 1;
    
    		do {
    			if( pos >= *n )
    			{
    				if( !( buf = realloc( buf, *n + GETDELIM_GROWBY ) ) ) /*动态分配缓冲区buuf*/
    				{
    					pos = -1;
    					break;
    				}
    				*n += GETDELIM_GROWBY;
    				*lineptr = buf;
    			}
    
    			/*从stream中获取一个字符*/
    			if( ( c = fgetc( stream ) ) != EOF )
    			{
    				buf[++pos - 2] = c; /*将字符放入buf*/
    				if( c != '\n' ) /*没检测到\n*/
    				{
    					continue;
    				}
    			}
    
    			/*已检测到\n*/
    
    			if( ( pos -= 2 ) >= 0 )
    			{
    				buf[++pos] = 0; /*将字符串末尾的\n替换为\0*/
    			}
    			break;
    
    		}while(1);
    
    	}
    	return pos;
    }
    

    该函数在访问 stream 时没有使用互斥锁,在多线程环境下应加上。

    如果在调用之前 *lineptr 设置为 NULL 并且 、*n 设置为 0,那么 getline() 将分配一个缓冲区来存储该行。 即使 getline() 失败,用户程序也应释放此缓冲区。或者,在调用 getline() 之前,*lineptr 可以包含一个指向 malloc 分配的缓冲区 *n 的指针字节大小。 如果缓冲区不够大,无法容纳该行,getline() 使用 realloc 调整其大小,根据需要更新 *lineptr 和 *n。

    展开全文
  • 下面小编就为大家带来一篇老生常谈C++getline使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 主要介绍了C++中getline()、gets()等函数的用法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 在我的印象中,getline函数经常出现在自己的视野里,模糊地记得它经常用来读取字符串。但是又对它的参数不是很了解,今天又用到了getline函数,现在来细细地总结一下:首先要明白设计getline函数的目的,其实很简单...

    在我的印象中,getline函数经常出现在自己的视野里,模糊地记得它经常用来读取字符串

    。但是又对它的参数不是很了解,今天又用到了getline函数,现在来细细地总结一下:

    首先要明白设计getline函数的目的,其实很简单,就是从流中读取字符串。而且读取的方

    式有很多,包括根据限定符,根据已读取的字符的个数。从这个函数的名称来看,它的直观

    意义是从流中读取一行,但是大家不要被这表面的现象所迷惑。其实如果让我来为这个函数

    去一个名字的话,或许我会取一个getString,因为它的目的本来就是从流中读取字符的序

    列,而不是像get函数那样一次读取一个字符。

    另外要注意,C++中有两个getline函数,一个是在string头文件中,定义的是一个全局的

    函数,函数声明是istream& getline ( istream& is, string& str, char delim )与

    istream& getline ( istream& is, string& str );另一个则是istream的成员函数,函

    数声明是istream& getline (char* s, streamsize n )与istream& getline (char*

    s, streamsize n, char delim );注意第二个getline是将读取的字符串存储在char数组

    中而不可以将该参数声明为string类型,因为C++编译器无法执行此默认转换。

    下面根据一个例子简单地介绍一下该函数:

    test.txt文件如下所示:

    a

    bcd

    e

    fgh

    i

    jk

    现在先尝试全局函数getline。从函数声明中我们观察到两种函数声明的不同主要体现在参

    数的个数上,如果是两个参数的话,那么默认的限定符便是‘\n’了,但是如果声明了限

    定符,'\n'是否仍然有效呢?我写了如下程序做测试:

    int main(){

    int n = 6;

    string tem;

    ifstream infile("test.txt");

    for(int i = 0;i

    //getline(infile,tem);

    getline(infile,tem,'\t');

    cout<

    }

    return 0;

    }

    输出结果是:

    abcd

    efg

    从中可以看出换行符确实失效了。所以getline函数的限定符只有一个,是相互覆盖的。

    再来看一下istream的getline函数:

    int main(){

    char a[3];

    ifstream infile("test.txt");

    infile.getline(a,3,'c');

    cout<

    }

    输出结果是a

    其实istream的getline是在全局函数的getline函数的基础上,又多了一个终止读取的条

    件,即根据已读取的字符的个数来判定,实际上是读取n-1个字符,因为最后要为‘\0’留

    下一个位置。其他地方二者基本相同。

    原理想必也很简单。每一次getline,文件指针都不断向下走,相当于不断的调用get函数

    并且将已经读取的字符保存下来。当遇到限定符或者已读取的字符个数达到了参数的要求(

    或者是由于文件的原因),那么便终止读取。如果是碰到了限定符,那么该字符便会被

    extracted and discarded,也就是文件指针向下再移一位,但是并不保存该字符,也就

    是每次getline之后,文件指针会停留在限定符的后面(遇到限定符的情况)。

    但是看下面的这个情况:

    int main(){

    int n = 13;

    string tem;

    ifstream infile("test.txt");

    for(int i = 0;i

    //getline(infile,tem);

    getline(infile,tem,'\t');

    cout<

    }

    return 0;

    }

    按照我的理解的话,那么文件中总共11个字母,当文件指针停在‘\t’之后,k之前的时候

    ,刚好是第八次,第九次getline的时候,由于在读过k之后,遇到了文件结束符,所以get

    指针应该停留在k之后,这个时候再getline的话应该是无效的,但是输出结果跟我想的不

    一样:

    a

    b

    c

    d

    e

    f

    g

    h

    i

    j

    k

    k

    k

    k

    k

    这说明第九次getline之后,get指针所指向的位置并没有改变,这说明我想的思路有问题

    ,于是我在网上看了getline函数的源码,其中有一篇注释比较好的:

    _Myt& getline(_Elem *_Str, streamsize _Count, _Elem _Delim)

    {// get up to _Count characters into NTCS, discard _Delim

    _DEBUG_POINTER(_Str);    //判断传入指针的合法性

    ios_base::iostate _State = ios_base::goodbit;

    _Chcount = 0; //从输入流中读取的字符数

    const sentry _Ok(*this, true);

    /*注:上面这句很关键,它关系到下面的if是否执行,也就是是否读输入流。这句从

    语法上看,是

    sentry是一个class, _Ok是sentry类的一个const对象,构造这个对象时需要传入两个

    参数

    第一个是流对象自身的引用,第二个表示对空白字符(如空格、制表符)的处理方式

    ,为true时意味着不忽略空白字符,即一个字符一个字符的从输入流中提取。

    */

    if (_Ok && 0 < _Count)

    /*

    **************************************************************************

    * sentry类内部重载了一个类型转换运算符,它把sentry类的实例转换成了一个bool

    表达式。

    * 这个表达式返回sentry类的私有成员_Ok的值。

    bool sentry::operator bool() const

    * { // test if _Ipfx succeeded

    *       return (_Ok);

    *   }

    * _Ok这个成员的值由sentry类的构造函数

    * 在初始化时设置,设置的过程比较麻烦,这里不做赘述(其实我也没看十分明白)。

    * 但可以肯定的是,当输入流的状态是正常时,这个成员的值也是true,

    * 反之,则是false。

    *

    * _Count是调用者传入的第二个参数,这里用做循环计数器的初值,以后每读一个字

    符,

    * _Count的值会减一。

    ****************************************************************************

    **/

    {

    // state okay, use facet to extract

    int_type _Metadelim = _Traits::to_int_type(_Delim);

    int_type _Meta = _Myios::rdbuf()->sgetc();//从输入流读一个字符

    for (; ; _Meta = _Myios::rdbuf()->snextc()) //snextc()从输入流中读取下一

    个字符

    if (_Traits::eq_int_type(_Traits::eof(), _Meta))

    {// end of file, quit

    _State |= ios_base::eofbit;

    break;

    }//注:遇到文件尾,getline结束

    else if (_Meta == _Metadelim) {

    // got a delimiter, discard it and quit

    ++_Chcount;    //读取字符数+1

    _Myios::rdbuf()->sbumpc();

    /*注:上面这句把结束符读掉了,如果不指定结束符,那就是把'\n'读掉了

    但回车符本身并没有拷贝到缓冲区中,

    这样下次的读操作将从回车符后面的第一个字符开始,

    */

    break;

    }/* 注:遇到结束符,getline结束,注意这里的顺序,它是先判断是否遇到结束

    符,后判断是否读入了指定个数的。 */

    else if (--_Count <= 0)

    {// buffer full, quit

    _State |= ios_base::failbit;

    break;

    }

    //注:读到了指定个数,执行到这里已经隐含了在指定个数的最后一位仍然不是

    结束符,

    //因此该部分将输入流状态置为了错误。

    //这直接导致了接下来的getline(或者get)以及>>运算符等读操作都不能正确执

    行)

    else {

    // got a character, add it to string

    ++_Chcount;  //读取字符数加1

    *_Str++ = _Traits::to_char_type(_Meta);

    }//注:这一分支将读取到的单个字符拷贝到缓冲区中

    }

    *_Str = _Elem();  //

    /* add terminating null character /*注:前面这句为字符串加入了终止符'\0'

    因为_Elem()构造了一个ascii码为0的字符对象*/

    _Myios::setstate(_Chcount == 0 ? _State | ios_base::failbit : _State);

    /*注:如果没有读入任何字符,要保持执行这一次getline之前的输入流状态,

    否则根据这一次getline执行的情况,设置输入流为相应状态。 */

    return (*this);   //返回输入流对象本身

    }

    但是我觉得这其中还是有问题,因为:

    sbumpc: advances the get pointer and returns the character pointed by it

    before the call.

    snextc: advances the get pointer and returns the character pointed by it

    after the call.

    由于是传引用,所以不论调用哪个,都会改变原文件流中get的指针所指向的位置。而且,

    告诉大家一个更为惊奇的结果便是:

    下面程序:

    int main(){

    int n = 6;

    string tem;

    ifstream infile("test.txt");

    for(int i = 0;i

    getline(infile,tem);

    //getline(infile,tem,'\t');

    cout<

    }

    return 0;

    }

    的输出结果为:

    a

    bcd

    e

    fgh

    i

    jk

    i

    jk

    i

    jk

    i

    jk

    不管按照我的想法还是按照对上面源码的理解,结果都不应该是这个样子。是源码错了,还

    是我的理解有问题?希望知道的朋友能指导一下。

    展开全文
  • getline函数介绍

    千次阅读 多人点赞 2022-04-24 14:35:34
    今天,小编将为大家讲解有关getline函数的相关知识。 目录 一.cin.getline(char* s, streamsize n, char delim) 二.getline(istream& is, string& str, char delim) 提到getline那就不得不提cin。 ...

    今天,小编将为大家讲解有关getline函数的相关知识。

    目录

    一.cin.getline(char* s, streamsize n, char delim)

    二.getline(istream& is, string& str, char delim)


    getline函数与cin是相辅相成的关系。

    相比于cin,getline的优点就是在输入字符串的时候能够输入空格。而cin则会在输入空格时自动结束输入。这一点与c语言中的scanf和gets函数很像。

    一.cin.getline(char* s, streamsize n, char delim)

    这个函数所需的头文件是<iostream>。

    可以理解为此时getline是cin这个类的一个函数,所在的命名空间是std,因此,输入的时候要写成std::cin.getline()。

    这里的参数char* s是输入的字符串变量, n是输入字符串的字符个数(第n个补'\0'), delim是输入终止条件,即遇到delim所代表的字符就终止输入。

    举例:

    char str[10];

    cin.getline(str, 7, 'a');

    当我们输入sdfazsertyg时,str会存放sdf因为我们默认当遇见a时结束。

    同理,当输入bcdefghijklm时,str会存放bcdefg因为我们规定了只能存放7个字符,而第7位补'\0'。

    值得注意的是,在正常使用时 char delim可以省略,c++语言默认为'\0'。 

    二.getline(istream& is, string& str, char delim)

    头文件:<string>

    is是标准输入流函数, str是用来存字符的变量名, delim是结束标志,此处作用与cin.getline()里的相同。

    需要注意的是:

    getline()是string流的函数,只能用于string类型的输入操作。

    cin.getline是std流的函数,用于char*类型的输入操作。

    换句话说,当你定义了一个string类型变量,只能用getline()来输入。

    当你定义了一个char*类型变量,只能用cin/cin.getline()输入。

    功能与cin.getline类似:


    创作不易,恳请三连支持 如有错误,敬请斧正

    展开全文
  • getline用法详解在默认情况下,awk支持从文件或者STDIN中读取数据。我们也可以使用getline来灵活读取数据,例如在main代码块执行过程中读取某个非待处理文件的数据,或者从某个读取某个shell命令结果数据。getline有...
  • getline使用

    2022-04-05 14:10:10
    getline可以读入整行,以回车作为结尾,故如果输入形式是一个整数n,之后n行含有空格的串,要先进行getline(cin,s);读取完整数n后的空格。 头文件是sstream,string #include <bits/stdc++.h> using ...
  • cin.get()和cin.getline()、getline()和gets()、getchar()的区别
  • Linux下的getline函数

    2021-05-17 06:52:28
    最近在做国嵌的mp3项目,在mp3主控程序中用到了这个函数,挺好使的,在...所需头文件#include 参数lineptr字符串,getline函数会给它分配一段空间,用来存储读取出来的行内容n整型数字,函数调用完后会把分配的空间...
  • getline读入

    2022-03-08 23:48:41
    getline读入的时候,会把回车也读入进去 所以在正式开始读入之前,要先getline(cin, s)一下,去掉之前的回车 然后就开始读入一整行啦, 就开始用stringstream ssin(s)//s是自己定义的字符串string,就可以把ssin当成...
  • cin、cin.get()、cin.getline()、getline()的区别

    万次阅读 多人点赞 2018-05-14 15:51:30
    cin.get()每次读取一整行并把由Enter键生成的换行符留在输入队列中,然而cin.getline()每次读取一整行并把由Enter键生成的换行符抛弃,比如: #include using namespace std; int main() { cout ; char name[15]; //...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 113,622
精华内容 45,448
关键字:

GetLine()