scanf 需要將讀取的數據寫入變量內存地址,因此參數必須是地址(指針)。
| 變量類型 | 調用方式 | 原因 |
|---|---|---|
| 基本類型(int, float, double, char 等) | `&var` | 變量名代表值,需取地址傳遞指針 |
| 字符數組(`char str[20]`) | `str` 或 `&str[0]` | 數組名退化為首元素地址,已是指針 |
| 指針變量(`char *p = malloc(10)`) | `p` | 指針本身儲存地址,直接傳遞 |
| 結構體 | `&struct_var` | 結構體變量代表整個結構,需取地址 |
| 結構體指針 | `struct_ptr` | 指針已是地址 |
C 語言函數參數傳遞是值傳遞。若不傳地址,`scanf` 只能修改副本,無法將讀取結果返回給調用者的變量。傳遞地址後,`scanf` 通過指針解引用直接修改調用者內存中的變量值。
int a;
scanf("%d", a); // 錯誤:傳遞值(未初始化垃圾值作地址)→ 段錯誤
scanf("%d", &a); // 正確
char str[20];
scanf("%s", &str); // 錯誤:&str 類型是 char(*)[20],與 %s 期望的 char* 不匹配(雖然地址相同,但類型不匹配,嚴格編譯器報警)
scanf("%s", str); // 正確
防止緩衝區溢出,指定最大寬度:
char buf[100];
scanf("%99s", buf); // 最多讀 99 字符,留 1 位給 \0
檢查返回值:`if (scanf("%d", &a) != 1) { /* 輸入失敗處理 */ }`