如題,直接貼代碼:
int main(void)
{
int i = 0;
static unsigned char input[300];
int len = 0;
unsigned char ch;
while (scanf("%1x", &ch) == 1) {
input[len++] = ch;
printf("%d ", len);
}
return 959;
}
當輸入123456h的時候,正常執行,列印輸出:1 2 3 4 5 6,如圖:

如果把代碼改一下,把第一行int注釋掉,就不能正常執行了:
int main(void)
{
// int i = 0;
static unsigned char input[300];
int len = 0;
unsigned char ch;
while (scanf("%1x", &ch) == 1) {
input[len++] = ch;
printf("%d ", len);
}
return 959;
}
當輸入123456h的時候,列印輸出:1 1 1 1 1 1,如圖:

單步除錯發現,進入while回圈后,執行完里面的陳述句,進入下一回圈時,變數len的值自動被置為0。
為什么會這樣?還請大佬們指點一下!
但如果我把ch變數定義中的char改為int,又正常了!如圖:

再然后,我把變數ch還是改回char型別,同時當我把第二個變數定義陳述句:
static unsigned char input[300];
的static去掉,改為:
unsigned char input[300];
程式又能正常運行了,如圖:

太詭異額!真是百撕不得其姐!
uj5u.com熱心網友回復:
https://blog.csdn.net/u011499425/article/details/52751636uj5u.com熱心網友回復:
是的啥編譯器?scanf 的%x格式,默認輸入是int*引數,樓主傳的是char*,懷疑記憶體被改壞了uj5u.com熱心網友回復:
或者clean以下,rebuild alluj5u.com熱心網友回復:
這個問題跟有沒有static沒有關系,建議樓主試一下把ch改成unsigned int ch;再測驗任何情況:1)加static和不加;2)加int i = 0;和不加int i = 0;(注釋掉);個人認為(測驗一樣)是一樣的,不會出現全是1的問題。
原因是%x是對unsigned int而言的,如果用unsigned char去接收這個輸入的值,那么勢必會越界呢,并且ch和len很近,所以越界先覆寫的就是len變數;
為了解決這個問題,把ch定義為unsigned int比較妥當,因為這樣不會出現越界問題,也不會出現不可判定的問題。
當然,加不加int i = 0;和static的問題都是這個引起的。
uj5u.com熱心網友回復:
你的ch是char,卻按int輸入(%1x),出現什么樣的情況都是可能uj5u.com熱心網友回復:

unsigned int char ch;就是原來的代碼,但是原來代碼在賦值的時候又加了一個強制型別轉換(unsigned char)ch,所以我很奇怪為什么不直接用unsigned char ch,才做了這些試驗。
不太明白你說的勢必會越界的問題,char有8bit位,%1x只有4bit位,怎么會越界呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/226738.html
標籤:C語言
上一篇:在ARM板上執行Qt程式,用QProcess播放Mplayer視頻,視頻外空白處一直閃屏
下一篇:字串連接后輸出錯誤
