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

C 語言 scanf 與 printf 格式字串錯誤修正

     編輯:程式設計疑難解答

原始錯誤程式碼

#include
main()
{
    int a;
    a = scanf("%d,&a);      // 格式字串未閉合、&a 位置錯誤
    int b;
    b = scanf("%b",&b);    // %b 非標準格式、未閉合雙引號
    printf("%d\n",a+b);
}

編譯錯誤分析

行錯誤說明
5"%d,&a)格式字串缺少結束雙引號,&a 應在引號外
7"%b",&b)%b 非標準輸入格式 (應為 %d 整數),同樣缺少引號
6a = scanf(...)scanf 回傳成功讀取項目數,非輸入值本身
8int b缺少分號

修正後程式碼

#include 

int main() {
    int a, b;
    
    printf("請輸入兩個整數 (空白分隔): ");
    // scanf 回傳成功讀取的項目數,正確讀取兩個整數時回傳 2
    if (scanf("%d %d", &a, &b) == 2) {
        printf("a = %d, b = %d\n", a, b);
        printf("a + b = %d\n", a + b);
    } else {
        printf("輸入格式錯誤,請輸入兩個整數。\n");
        return 1;
    }
    
    return 0;
}

關鍵知識點

  • scanf 格式字串:"%d %d" 連續讀取兩個整數,中間空白自動跳過
  • 位址運算子 &:&a, &b 傳遞變數位址供 scanf 寫入
  • scanf 回傳值:成功轉換賦值的項目數,EOF 表示輸入結束
  • main 回傳型別:標準 C 要求 int main() 並 return 0
  • 標準輸入緩衝:輸入以 Enter 結束,空白/換行均作分隔

進階:輸入驗證與緩衝區清理

int a, b;
char buf[100];

while (1) {
    printf("請輸入兩個整數: ");
    if (fgets(buf, sizeof(buf), stdin)) { // 讀取整行
        if (sscanf(buf, "%d %d", &a, &b) == 2) {
            break; // 解析成功跳出迴圈
        }
    }
    printf("格式錯誤,請重新輸入。\n");
}

printf("結果: %d + %d = %d\n", a, b, a + b);

使用 fgets + sscanf 避免 scanf 留殘留字元在緩衝區導致後續讀取異常。

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