scanf 兩三事

記得以前寫程式的時候,scanf 是很常用到的輸入功能。但寫 Windows 程式後就很少碰到它了,直到之前發生了一些靈異現像,才重新勾起對它的回憶。首先看看以下的程式碼吧

int _tmain(int argc, _TCHAR* argv[])
{
 short int i=0, j=0;
 _tprintf(_T("Please input number : "));
 _tscanf_s(_T("%d"),&i);
 _tprintf(_T("i = %d, j = %d\n"), i, j);
 return 0;
}



看起來沒甚麼問題,執行看看吧



i 怎麼會出問題呢?我們把中斷點設在 scanf,然後看看 i 的 memory 內容吧


scanf 前的內容為 0 (short int 佔 2 Bytes)


輸入 100000 後,卻佔了 4 Bytes,所以才會產生以上的錯誤訊息。

查了 MSDN scanf Width Specification 才發現 scanf %d 會使用 4 Bytes 的空間,所以 short int 改成 %hd (佔 2 Bytes) 就沒問題了,即使輸入的數值超過 short int 的範圍 (例如 100000),scanf 也會把它截掉,不會佔用別的  Memory 空間

不過 1 Byte 的數值仍無解,無法用 %c (char) 來代替,需特別注意

留言

這個網誌中的熱門文章

Linux 批次檔的寫法

【分享】如何顯示 Debug Message

[分享] Visual Studio 遠端偵錯