標準 C 無 getline,需自行實現讀取一行(含空行)。關鍵:區分 EOF 與空行。
int getline2(char s[], int lim) {
int c, i = 0;
while ((c = getchar()) != EOF && c != '\n' && i < lim-1)
s[i++] = c;
if (c == EOF && i == 0) return -1; // 真正結束
if (c == '\n') s[i++] = c; // 可選:保留換行符
s[i] = '\0';
return i;
}
Windows EOF = Ctrl+Z,Linux/Mac = Ctrl+D。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
lineptr:指向動態分配緩衝區指針,NULL 時自動分配n:緩衝區大小,自動 realloc 擴容free(*lineptr)<iostream>)
istream& getline(char* s, streamsize n);
istream& getline(char* s, streamsize n, char delim);
delim(默認 '\n'),不保存分隔符<string>,推薦)
istream& getline(istream& is, string& str);
istream& getline(istream& is, string& str, char delim);
std::string,自動管理內存while (getline(cin, line)) cout << line << endl;| 版本 | 頭文件 | 參數 | 保存換行符 | 內存管理 |
|---|---|---|---|---|
| C 手寫 | — | char[], int | 可選 | 手動 |
| GCC getline | stdio.h | char**, size_t*, FILE* | 是 | 自動 malloc/realloc,需 free |
| C++ iostream::getline | iostream | char*, streamsize, char | 否 | 手動緩衝區 |
| C++ std::getline | string | istream&, string&, char | 否 | 自動 string |
cin >> x 後殘留換行符,緊接 getline 會讀到空行 → 需先 cin.ignore() 或 ws(cin)getline 返回值含換行符,C++ 版不含eof()