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); // 非常重要,否则可能会造成内存泄漏