• C++ getline读取一行字符串的几种方法


    结论:
    1)cin.getline从cin读取数据,受限于用户提供缓存大小;
    2)C++ getline搭配string,从cin读取一行字符串,无缓冲区大小限制;
    3)C getline从stdin读取数据,空间会自动扩充,但需要用户手动释放;

    利用getline函数从标准输入流读取一行字符串,有3种用法:

    1. cin.getline
    循环接收一行字符串,直到EOF,每行按遇到换行符为止,需要预留null byte()空间。
    如果缓存装满,函数返回nullptr。

    也就是说,下面代码有2种退出循环情况:1)遇到EOF;2)输入字符串长度 + 1,超过用户提供的缓存空间。

    #define LINE_MAX 1024
    
    char s[LINE_MAX ];
    while (cin.getline(s, sizeof(s))) {
        // 处理s
        cout << s << endl;
    }
    

    注:Windows风格换行符是CRLF( ),Unix风格换行符是LF( )

    2. C++风格getline
    循环接收一行字符串,直到EOF。

    由于string是自动增长空间的,因此,一般不存在输入超过缓冲区的情况。故下面循环退出条件只有:遇到EOF。

    string s2;
    while(getline(cin, s2)) {
        cout << s2 << endl;
    }
    
    

    3. C风格getline
    C风格getline从指定文件流stream读取一行字符串。如果用户未提供缓存空间或者提供的空间大小不够,函数会自动调用malloc扩充空间,因此需要调用者负责释放缓存空间。
    getline返回-1,代表出错或者遇到EOF。

    #include <stdio.h>
    ssize_t getline(char **lineptr, size_t *n, FILE *stream);
    

    可以参见之前写的这篇文章Linux C getline, gets, fgets 函数区别

    char *line = NULL;
    size_t len = 0;
    FILE *fp = stdin;
    while (getline(&line, &len, fp) != -1) { // line为NULL时, getline 自动malloc空间
        printf("%s
    ", line);
    }
    
    free(line); // 非常重要,否则可能会造成内存泄漏
    
  • 相关阅读:
    汇编语言
    离散数学:每条边的权重均不相同的带权图有唯一最小生成树
    android源码如何起步与阅读方法
    linux内核——会话、进程组、线程组
    ubuntu系统——增加磁盘空间
    Android系统源代码——所需工具
    android源码相关网站
    git——分布式版本控制系统
    linux内核——进程,轻量级进程,线程,线程组
    Android系统源代码学习步骤
  • 原文地址:https://www.cnblogs.com/fortunely/p/15463889.html
Copyright © 2020-2023  润新知