簡體   English   中英

當c是char時使用scanf(“%d”,&c)會發生什么?

[英]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 == 1j == 3i & 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM