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

C語言 scanf 格式串中換行符導致字符大小寫轉換程序異常的解決方案

     編輯:C 語言問答

問題代碼

#include <ctype.h>
int main() {
    char c;
    scanf("%c\n", &c);  // 格式串包含 \n
    if (isupper(c)) c = tolower(c);
    else c = toupper(c);
    printf("%c\n", c);
    return 0;
}

現象:必須輸入兩個以上字符 (如 a⏎b⏎) 程序才轉換第一個字符。

根因分析

  • scanf 格式串中的 \n (或空格、\t) 代表匹配並跳過任意數量的空白字符。
  • 執行流程:
    1. %c 讀取第一個字符 (如 'a') 存入 c。
    2. \n 要求繼續讀取輸入流,直到遇到非空白字符 為止。
    3. 用戶按下 Enter 產生 \n (空白),scanf 繼續等待下一個字符。
    4. 用戶輸入第二字符 (如 'b') 並按 Enter,scanf 匹配到非空白字符 'b',將其放回輸入流,scanf 返回。
    5. 程序轉換 c (即第一個字符 'a') 並輸出,但第二字符 'b' 殘留在緩衝區,影響後續邏輯。

修正代碼

#include <stdio.h>
#include <ctype.h>

int main() {
    char c;
    scanf("%c", &c);  // 移除 \n
    if (isupper(c)) c = tolower(c);
    else c = toupper(c);
    printf("%c\n", c);
    return 0;
}

關鍵知識點

格式符對空白字符處理典型用途
%d %f %s自動跳過前導空白,讀取數據後留存後續空白數值、字符串輸入
%c不跳過,直接讀取下一字符 (含空白)單字符輸入
%[...]不跳過,掃描集匹配特定字符集輸入
格式串中的空白 ( \n \t)匹配並跳過輸入流中任意數量空白字符分隔符、換行吸收

最佳實踐

  1. 掃描單字符時,格式串絕不包含 \n 或空格:scanf("%c", &c);。
  2. 若需跳過前導換行/空格再讀字符,用 scanf(" %c", &c); ( %c 前加一空格)。
  3. 更健壯的方案:fgets(buf, sizeof(buf), stdin); sscanf(buf, " %c", &c); 整行讀取後解析,徹底隔離緩衝區問題。

總結

scanf("%c\n", &c) 中的 \n 導致 scanf 繼續吞噬輸入直到遇到下一個非空白字符,造成「需多輸入一字符」的假象。移除格式串中的 \n,或改用 " %c" 跳過前導空白,即可恢復預期的單字符讀取行為。

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