scanf是C語言標準輸入的核心函數,但初學者常因不理解「傳地址」機制而踩坑。本文從內存模型切入,徹底講透scanf的工作原理、多樣用法與常見陷阱。
內存地址以十六進制表示(如0x7ffee3b8),每個地址對應一個字節(8位)。不同類型佔用字節數不同:
char:1字節short:2字節int:通常4字節(視編譯器/架構)double:8字節數據越大,所需字節越多。
int b=10; int a=20;中,&b > &a。int a;
printf("a的地址:%p\n", &a); // 正確查看地址
警告:未初始化的變量值不可預測(垃圾值),嚴禁直接使用:
int a;
printf("%d\n", a); // 未定義行為!
#include <stdio.h>
int scanf(const char *format, ...);
作用:從標準輸入(鍵盤)讀取數據,按格式字符串解析,將結果存入變量地址指向的內存。
int age;
scanf("%d", &age);
%d:要求輸入十進制整數。&age:取age的地址(地址運算符&),scanf通過此地址將輸入值寫入變量內存。格式字符串中的非格式字符(如-、,、#、字母)會作為精確匹配的分隔符:
scanf("%d-%d-%d", &a, &b, &c); // 輸入必須為:10-14-20
scanf("%d,%d,%d", &a, &b, &c); // 輸入:10,14,20
scanf("%d#%d#%d", &a, &b, &c); // 輸入:10#14#20
scanf("%dx%dx%d", &a, &b, &c); // 輸入:10x14x20
若輸入不匹配分隔符,解析將失敗或停留。
格式字符串中的空格、Tab、換行均視為「任意長度的空白字符」分隔符:
scanf("%d %d %d", &a, &b, &c);
輸入可為:10 14 20、10\t14\n20、甚至分多行輸入。這是最常用、最靈活的方式。
scanf("%d\n", &a); // 錯誤!導致scanf無法返回,持續等待非空白字符
\n在格式串中意味著「匹配並丟棄任意數量空白字符」,程序會卡住等待下一個非空白輸入。
#include <stdio.h>
int main() {
int n1, n2;
printf("請輸入兩個整數(空格分隔):");
if (scanf("%d %d", &n1, &n2) == 2) {
printf("和 = %d\n", n1 + n2);
} else {
printf("輸入格式錯誤!\n");
}
return 0;
}
&var(數組名/指針變量本身即地址除外)。scanf返回成功賦值的項目數,利用它做輸入驗證。理解內存地址與格式解析機制,scanf不再是「黑盒」,而是可控的輸入利器。