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

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

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

1. cin.getline
循环接收一行字符串,直到EOF,每行按遇到换行符为止,需要预留null byte(\0)空间。
如果缓存装满,函数返回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(\r\n),Unix风格换行符是LF(\n)

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\n", line);
}

free(line); // 非常重要,否则可能会造成内存泄漏
posted @ 2021-10-26 00:01  明明1109  阅读(4510)  评论(0编辑  收藏  举报