首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言 scanf 與 gets 空格處理差異:分隔符與換行符的解析邏輯

     編輯:程式設計綜合問答

現象

輸入 hello world(含空格),scanf("%s", str) 僅讀取 hello,而 gets(str) 讀取整行 hello world。

底層解析邏輯

函數讀取起始讀取終止條件緩衝區殘留
scanf("%s")跳過空白字符(空格、制表符、換行符),遇第一個非空白字符開始遇下一個空白字符(空格/制表符/換行符)停止,空白字符留在輸入流空格、換行符仍在 stdin
gets()直接從當前位置開始(不跳過空白)遇換行符 \n 停止,換行符被讀取並丟棄,不存入緩衝區無殘留換行符

示例流程

輸入流:h e l l o [空格] w o r l d [回車]\n

  1. scanf("%s", s1):
    — 跳過無前導空白 → 讀取 hello → 遇空格停止。
    — 流剩餘:[空格] world\n
  2. gets(s2):
    — 直接讀取 → 遇 \n 停止 → 存入 world(含前導空格)。
    — 流剩餘:空。

安全警示

  • gets() 已從 C11 標準移除(C99 標記棄用),極易造成緩衝區溢出,嚴禁使用。
  • 替代方案:
    — fgets(str, sizeof(str), stdin):指定最大長度,保留換行符(需手動去除)。
    — scanf("%99[^\n]", str):掃描集讀取至換行符(需配合 getchar() 吞掉換行符)。

最佳實踐

char line[1000];
if (fgets(line, sizeof(line), stdin)) {
    line[strcspn(line, "\n")] = '\0'; // 去除尾部換行符
    // 處理 line
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved