[英]What happens when using scanf(“%d”, &c) while c is a char?
代碼是這樣的:
char c;
scanf("%d", &c);
輸入3 ...
我的猜測是,當輸入3
時,它的類型為int
;
然后將其降級為char並分配給c
;
我在說明符%d
打印c
的值,結果為3,似乎與預期的一樣;
但是用指定符%c
打印c
的值會在終端上顯示-空白-這是一個問題...(1);
為了測試更多,我還聲明了一個類型為char
的變量ch
,並像這樣初始化它:
char ch = 1;
測試是這樣的:
(i&j)? printf("yes") : printf("no");
結果為“否”
我打印出i&j
的值,它是0
但是1&3
應該是1
? 這是另一個問題。...(2);
我的問題是(1)和(2)
您實際上是在執行未定義的行為。
通過使用格式字符串%d
,您告訴scanf
期望一個int*
作為參數,並向其傳遞一個指向單個字符的指針。 請記住,與傳遞格式字符串中的內容相比, scanf
沒有進一步的類型信息。
這將導致scanf
嘗試將一個int
大小的值寫入一個指向char
大小的保留的地址的內存,這可能(對於大多數體系結構)超出范圍。
調用UB后,您所有的計算都將關閉。
假設scanf()不是varargs函數,而是一個以int指針作為第二個參數的普通普通函數:
int noscanf(char *format, int *ptr)
{
*ptr = 42;
return 1;
}
int main(void)
{
char ch;
int rc;
// This should *at least* give a warning ...
rc = noscanf("Haha!" , &ch);
return 0;
}
現在,scanf() 是一個varargs函數。 scanf()確定(指針)參數類型的唯一方法是檢查格式字符串。 一個%d表示:下一個參數應該是一個指向int的指針。 因此scanf可以愉快地將sizeof(int)
個字節寫入* ptr。
我在那里看不到變量j
。 因此, i&j
將為0。是的,如果i == 1
且j == 3
則i & j == 1
。
(i&j)? printf(“ yes”):printf(“ no”);
對於i = 1和j = 3,語句給出的輸出為yes。
對於(1)問題,ASCII 3表示不可打印的STX char。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.