輸入姓名、學號後,調用 getchar() 讀取性別、職業,結果性別讀到換行符 \n,職業讀到性別字符,導致邏輯錯誤。
scanf("%d", &num) 讀取整數後,**緩衝區殘留換行符 \n**。緊接的 getchar() 直接讀取該換行符,而非用戶輸入的字符。
| 方案 | 代碼 | 優缺點 |
|---|---|---|
| 1. 讀取前清空緩衝區 | while (getchar() != '\n'); 或 fflush(stdin)(非標準,僅 MSVC 支持) | 通用、無需修改格式字符串 |
| 2. scanf 格式字符串吸收空白 | scanf(" %c", &sex);(%c 前加空格) | 最簡潔、標準 C 支持,自動跳過任意空白字符 |
| 3. 統一用 fgets + sscanf | fgets(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 是 C11 可選擴展,MSVC 實現。跨平台建議用 fgets(name, sizeof(name), stdin) 並手動去除尾部 \n。