當scanf()
讀取輸入時,它不能根據規範進行轉換,它會停止掃描並返回成功轉換的次數。在你的情況下,字符保留在標準輸入緩衝區中,scanf()
返回0
。
您的代碼具有未定義的行爲,因爲scanf()
未能將輸入轉換爲整數,因此未對u
進行初始化。將未初始化的值傳遞給printf
具有未定義的行爲。在你的情況下,會打印一個稍微隨機的值,這個值可能不同或不一樣,但是包括崩潰在內的任何其他行爲都是可能的。
您必須測試返回值scanf()
以檢查轉換是否成功。這裏是一個修改版本:
#include <stdio.h>
int main(void) {
int u, res;
res = scanf("%d", &u);
if (res == 1) {
/* conversion succeeded */
printf("%d\n", u);
} else
if (res == 0) {
/* conversion failed */
printf("input is not a valid number\n");
} else {
/* res must be EOF */
printf("premature end of file: no input given\n");
}
return 0;
}
'scanf'失敗,返回0並且代碼中的下一條語句執行。這與'scanf'行不在那裏一樣。簡而言之,當你試圖打印一個未初始化的變量時,你的代碼調用未定義的行爲 –