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

C 語言 getchar() 讀取換行符導致跳過輸入的經典問題與解決

     編輯:程式設計綜合問答

現象

輸入姓名、學號後,調用 getchar() 讀取性別、職業,結果性別讀到換行符 \n,職業讀到性別字符,導致邏輯錯誤。

根本原因

scanf("%d", &num) 讀取整數後,**緩衝區殘留換行符 \n**。緊接的 getchar() 直接讀取該換行符,而非用戶輸入的字符。

三種解決方案

方案代碼優缺點
1. 讀取前清空緩衝區while (getchar() != '\n'); 或 fflush(stdin)(非標準,僅 MSVC 支持)通用、無需修改格式字符串
2. scanf 格式字符串吸收空白scanf(" %c", &sex);(%c 前加空格)最簡潔、標準 C 支持,自動跳過任意空白字符
3. 統一用 fgets + sscanffgets(buf, sizeof(buf), stdin); sscanf(buf, "%c", &sex);徹底避免緩衝區殘留,適合行導向輸入

推薦寫法

scanf("%d", &person[i].num);
scanf(" %c", &person[i].sex);   // 空格吃掉殘留 \n
scanf(" %c", &person[i].job);   // 同上

擴展:gets_s 安全性

gets_s 是 C11 可選擴展,MSVC 實現。跨平台建議用 fgets(name, sizeof(name), stdin) 並手動去除尾部 \n。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved