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

C 語言 scanf_s 迴圈導致螢幕顯示大量「燙」字之原因與修正

     編輯:程式設計綜合問答

現象描述

執行以下程式碼,輸入字元後按 Enter,螢幕會不斷印出「燙」字(亂碼):

#include <stdio.h>
int main(void) {
    char ch;
    scanf_s("%c", &ch);
    while (ch != 'g') {
        printf("%c", ch);
        scanf_s("%c", &ch);
    }
    return 0;
}

根本原因

  1. 緩衝區殘留換行符:`scanf_s("%c", &ch)` 會讀取包括空白、換行在內的任意單一字元。使用者輸入「a」並按 Enter 後,緩衝區實際存入 'a' 和 '\n'。第一次讀取取得 'a',第二次迴圈直接讀取殘留的 '\n',導致條件判斷與輸出異常。
  2. Visual Studio 預設字元集:若專案設定為 Unicode,`char` 可能被視為有號字元,印出非可見字元時顯示為「燙」(0xCCCC 記憶體填充模式)。

修正方法

方法一:跳過空白字元(推薦)

在格式字串前加空格:scanf_s(" %c", &ch),告知函式忽略前導空白(含換行)。

#include <stdio.h>
int main(void) {
    char ch;
    scanf_s(" %c", &ch);  // 注意 %c 前有一空格
    while (ch != 'g') {
        printf("%c", ch);
        scanf_s(" %c", &ch);
    }
    return 0;
}

方法二:手動清空緩衝區

while ((getchar()) != '\n'); // 讀取並丟棄殘留字元

方法三:改用 fgets 讀取整行再解析

char buf[10];
fgets(buf, sizeof(buf), stdin);
ch = buf[0];

補充說明

  • `scanf_s` 為 Microsoft 安全版本,需包含 `` 且第二參數需傳緩衝區大小(針對 `%s`),`%c` 單字元可不傳大小。
  • 若使用 GCC/Clang 編譯,請改用標準 `scanf`。

總結

「燙」字實為未初始化記憶體或控制字元顯示異常。核心解決之道在於正確處理輸入緩衝區的換行符,建議採用 scanf_s(" %c", &ch) 寫法。

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