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

C語言 scanf 忘記取地址符 & 導致輸入失效:經典新手錯誤

     編輯:C 語言問答

錯誤代碼


#include <stdio.h>
#include <math.h>
main() {
    int a, b, c, d;
    scanf("%d,%d,%d", a, b, c);  // ❌ 缺少 & 取地址符
    // ... 排序邏輯 ...
}

現象:程序無法正確讀取輸入,變量值為隨機垃圾值,排序結果錯誤。

根因:scanf 需要變量地址以修改其值

  • scanf 原型:int scanf(const char *format, ...);,可變參數**必須是指針**(地址)。
  • a 是 int 值(垃圾值),傳值調用,**無法修改原變量**。
  • &a 是 int*(地址),scanf 通過地址寫入內存,**正確修改變量**。

正確代碼


scanf("%d,%d,%d", &a, &b, &c);  // ✅ 每個變量前加 &

格式串中的逗號 , 也需注意

  • scanf("%d,%d,%d", ...) 要求輸入**必須包含逗號分隔**(如 1,2,3)。
  • 若用戶輸入空格分隔 1 2 3,**匹配失敗**,後續變量不被賦值。
  • **建議**:scanf("%d %d %d", &a, &b, &c); —— 空格匹配任意空白字符(空格、換行、Tab),更友好、魯棒。

舉一反三:scanf 常見錯誤清單

錯誤代碼問題修正
scanf("%d", a);缺 &scanf("%d", &a);
scanf("%s", &str); (str為字符數組)數組名已是地址,加 & 類型錯誤 (char(*)[N] vs char*)scanf("%s", str); 或 scanf("%s", &str[0]);
scanf("%c", &ch); 連續調用殘留換行符被讀取scanf(" %c", &ch); (格式串前加空格跳過空白)
scanf("%f", &d); (d為 double)格式符不匹配 (%f 對應 float*)scanf("%lf", &d);
不檢查返回值輸入失敗未處理if (scanf("%d", &a) != 1) { /* 錯誤處理 */ }

調試技巧:打印地址與值確認


printf("調試: &a=%p, a=%d\n", (void*)&a, a);
scanf("%d", &a);
printf("調試: 輸入後 a=%d\n", a);

總結

scanf **必須傳遞變量地址**(&var),否則無法修改變量值。
字符數組/字符串輸入**不加 &**。
格式串**優先用空格分隔**,兼容性更好。
**養成檢查 scanf 返回值**習慣,健壯處理輸入錯誤。
這是 C 語言新手**最高頻、最隱蔽、後果最嚴重**的錯誤之一,務必刻意練習直到肌肉記憶。

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