

我是小白,請大神們盡量詳細一點,不勝感激!
uj5u.com熱心網友回復:
scanf_s("%s",name,40);
uj5u.com熱心網友回復:
正如1樓所說,scanf_s()函式與scanf()函式不同,當輸入的型別是字符或者字串時,scanf_s()函式需要指定保存輸入字符或字串的緩沖區的大小。char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); //保存輸入字串的緩沖區的大小是10,而指定的字串的大小是9
uj5u.com熱心網友回復:
如果輸入的型別是整數、浮點數等型別,則不需要在scanf_s()函式中指定緩沖區的大小。scanf_s("%d", &num);
uj5u.com熱心網友回復:
char name[40];
這行代碼出的問題。執行這行代碼時,你的計算機只會開辟出連續的40個位元組的記憶體空間,給名為name的變數。
但是你并沒有給這片記憶體空間賦初識值。windows系統會給這片記憶體的所有位元組都賦一個默認的初始值0XCC。
之后通過scanf_s函式給name陣列的前9個位元組賦了值:“Christine”,但是你后面的31個位元組仍然是0XCC。
再然后你通過printf,以%s的格式輸出字串陣列name,
但是你要知道,字串是遇到'\0'(對應的ASCII碼值為0)字符時認為字串結束。但可惜你整個name陣列都沒有一個'\0'字符。
也就是說,記憶體會繼續檢索后面的位元組。直到遇到'\0'位置。
結果不但是錯誤的,而且是危險的,因為這樣做會導致記憶體越界。
正確的改正方法很簡單:在申請字串陣列時給它賦初值就可以了:
char name[40] = { 0 };
這樣的話,name中所有的位元組都是0(即'\0'),后面的操作就不會例外了
uj5u.com熱心網友回復:
這樣還是不行,1樓的可以
uj5u.com熱心網友回復:
scanf_s("%s", name, sizeof(name));缺少第三個引數,對于%s, %c需要指定長度,否則可能會越界;
樓主的輸入應該是越界導致的。
建議樓主查一下scanf_s的用法~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/15855.html
標籤:C語言
上一篇:C語言運行完自動關閉視窗
