C語言裡scanf讀入字串時的小問題

2021-10-17 14:20:56 字數 860 閱讀 4334

原來對於字元指標和字元陣列的區別很模糊

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...