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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM