首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ getline 函數總結:C 語言實現、GCC 擴展、C++ 標準庫多態用法

     編輯:關於C++

C 語言手寫 getline

標準 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。

GCC 擴展 getline (POSIX.1-2008)


#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

ssize_t getline(char **lineptr, size_t *n, FILE *stream);
  • lineptr:指向動態分配緩衝區指針,NULL 時自動分配
  • n:緩衝區大小,自動 realloc 擴容
  • 返回讀取字節數(含換行符),EOF 返回 -1
  • 使用後必須 free(*lineptr)

C++ 標準庫 getline

流成員函數(<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 getlinestdio.hchar**, size_t*, FILE*是自動 malloc/realloc,需 free
C++ iostream::getlineiostreamchar*, streamsize, char否手動緩衝區
C++ std::getlinestringistream&, string&, char否自動 string

常見陷阱

  • cin >> x 後殘留換行符,緊接 getline 會讀到空行 → 需先 cin.ignore() 或 ws(cin)
  • GCC getline 返回值含換行符,C++ 版不含
  • 文件讀取時檢查返回值而非 eof()
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved