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

C語言字符輸入陷阱:scanf 讀取空格導致排序邏輯失效

     編輯:程式設計疑難解答

問題代碼

scanf("%c%c%c", &a, &b, &c);
if (a > b > c) printf("%c %c %c", c, b, a);

用戶發現:輸入 c b a (帶空格) 時程序無輸出,誤以為排序邏輯錯誤。

根本原因

scanf("%c") 會讀取所有字符,包括空格、換行、制表符等空白字符。

  • 輸入 c b a\n 實際字符序列:'c', ' ', 'b', ' ', 'a', '\n'
  • scanf("%c%c%c") 依次讀取:a='c', b=' ' (空格), c='b'
  • 剩餘 ' ', 'a', '\n' 留在緩衝區,導致後續邏輯混亂。

正確的輸入處理方式

方法一:跳過空白字符 scanf(" %c", ...)

在 %c 前加空格,告訴 scanf 忽略任意數量的空白字符(空格、換行、Tab)。

scanf(" %c %c %c", &a, &b, &c); // 每個 %c 前都有空格

方法二:讀整行再解析 fgets + sscanf

更健壯,避免緩衝區殘留問題。

char line[100];
fgets(line, sizeof(line), stdin);
sscanf(line, " %c %c %c", &a, &b, &c);

方法三:字符排序邏輯修正

原代碼 if (a > b > c) 在 C 中不成立鏈式比較,應拆分:

// 冒泡排序三個字符
char temp;
if (a > b) { temp = a; a = b; b = temp; }
if (b > c) { temp = b; b = c; c = temp; }
if (a > b) { temp = a; a = b; b = temp; }
printf("%c %c %c", a, b, c); // 從小到大

完整修正示例

#include <stdio.h>

int main() {
    char a, b, c;
    printf("請輸入三個字符(用空格分隔): ");
    // 關鍵:%c 前加空格跳過空白符
    if (scanf(" %c %c %c", &a, &b, &c) != 3) {
        printf("輸入錯誤\n");
        return 1;
    }

    // 簡單選擇排序
    char arr[3] = {a, b, c};
    for (int i = 0; i < 2; i++) {
        for (int j = i+1; j < 3; j++) {
            if (arr[i] > arr[j]) {
                char t = arr[i]; arr[i] = arr[j]; arr[j] = t;
            }
        }
    }
    printf("排序結果: %c %c %c\n", arr[0], arr[1], arr[2]);
    return 0;
}

總結

  • %c 不跳過空白符,%d/%s/%f 會自動跳過。
  • 讀字符時習慣在 %c 前加空格,或改用 fgets 整行讀取。
  • C 語言不支持 a > b > c 鏈式比較,需拆分為多條判斷語句。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved