原來對於字元指標和字元陣列的區別很模糊
1、無意間嘗試用scanf讀入未初始化的字元指標報了段錯誤
char
*str1,
*str2;
scanf
("%s"
, str1)
;scanf
("%s",str2)
;
字元指標如果沒有像這樣
char
*str1 =
"abcdef"
//str1指向的是字串常量池的位址
顯式地進行初始化
或者沒有用malloc分配堆記憶體空間
則字元指標是指向的不確定記憶體空間(隨機值),scanf也就無法進行正常讀入,從而造成非法訪問記憶體(段錯誤)
2、如果用scanf讀入字元陣列當中,沒有限制讀取字元的最大長度(個數),scanf就會在遇到空白符(\n、\t…)之前一直將字元讀入輸入緩衝區中,超過了字元陣列的長度,可能會發生非法訪問以及其他未知的錯誤。
例如:
char str[21]
;main()
以上**,如果讀取的字元個數超過字元陣列的長度,scanf仍然會繼續讀入下去,這可能造成
1、可能的非法訪問(段錯誤)
2、如果執行正常,printf也會輸出所有之前讀入的字元(printf輸出字串也是遇到 』 \0 』 字元才停止輸出),與預期的最多隻輸出20個字元的期望不符。
原因:c語言在讀入字元陣列時,不儲存字元陣列的長度資訊(c++中的cin就沒有這樣的問題),讀入的資料長度由程式設計師規定,否則就會出現諸如緩衝區溢位,從而導致安全問題。
基礎不牢,地動山搖,繼續努力
scanf讀入字串與讀入字元的區別
今天下午比賽時候有道題用c 輸入輸出是超時的,所以準備換上c試試,發現幾個小問題 1 使用scanf c a 讀取a a是char型別 如果讀取之前有換行符或者空格,那麼a就會把之前的換行符或者空格讀取到,解決方法就是這之前先getchar 一下。2 而如果用scanf s str 讀取str 我發...
字串讀入問題 C語言
字串讀入3種形式 scanf gets getchar scanf不可以讀入空格,讀入空格即可停止,算乙個字元陣列 不含空格 可以應用於2個句子間有很多空格,但2個句子本身沒有空格 gets可以讀入空格,可以讀入含有空格的句子的時候,getchar是讀入乙個字元,可以讀入空格,經常用於處理讀掉空格。...
C語言 關於scanf讀入字串的一些問題
scanf是c語言中常用的標準輸入輸出函式,它的常規用法是scanf 輸入格式 輸入位址 scanf從輸入緩衝區取入資料按照指定的 輸入格式 儲存到指定的 輸入位址 但是有一類問題通常令人頭疼,那就是字串的讀入,此處僅僅討論使用scanf讀取字串的一些問題。理論上你只需要定義乙個字元指標,然後sca...