結論:
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); // 非常重要,否則可能會造成內存泄漏
