首先,sizeof(str)的值肯定是5,這個沒啥好說的,和你輸入多少個字元木有關係。
關於你發現的問題,請注意scanf和printf調出使用當中傳遞給函式的2個引數str實際上(或說本質上)都是字元型的指標,意思是說你只是告知了函式1個記憶體當中的地址而已,並不包含任何關於字串長度的資訊。
scanf函式只負責把你輸入的一串字元儲存到記憶體中從你指定的那個地址開始的空間中去,並不負責檢查你輸入的字串是不是實際超出了你定義的字元陣列的長度。這裡1個很嚴重的問題是:雖然貌似你輸入了多的字元也儲存起來了,但實際山是佔用了非法的記憶體空間儲存起來的,也就是不屬於str字元陣列的空間。
對於像scanf這類輸入函式不檢查使用者輸入是不是合理合法就儲存的做法是非常危險的。(原因是由於涉及到了指標的操作了。)換句話說,這樣的程式碼是非常脆弱的。(不健壯)
而對於printf函式,道理差不多。
你只是給出了1個地址,之後printf函式就從這個地址開始讀入資料並轉換輸出,對於%s指示符而言,直到讀出的字元是“空字元”為止。
要想完全正確理解這個現象,要對指標的概念有比較正確的認識。
首先,sizeof(str)的值肯定是5,這個沒啥好說的,和你輸入多少個字元木有關係。
關於你發現的問題,請注意scanf和printf調出使用當中傳遞給函式的2個引數str實際上(或說本質上)都是字元型的指標,意思是說你只是告知了函式1個記憶體當中的地址而已,並不包含任何關於字串長度的資訊。
scanf函式只負責把你輸入的一串字元儲存到記憶體中從你指定的那個地址開始的空間中去,並不負責檢查你輸入的字串是不是實際超出了你定義的字元陣列的長度。這裡1個很嚴重的問題是:雖然貌似你輸入了多的字元也儲存起來了,但實際山是佔用了非法的記憶體空間儲存起來的,也就是不屬於str字元陣列的空間。
對於像scanf這類輸入函式不檢查使用者輸入是不是合理合法就儲存的做法是非常危險的。(原因是由於涉及到了指標的操作了。)換句話說,這樣的程式碼是非常脆弱的。(不健壯)
而對於printf函式,道理差不多。
你只是給出了1個地址,之後printf函式就從這個地址開始讀入資料並轉換輸出,對於%s指示符而言,直到讀出的字元是“空字元”為止。
要想完全正確理解這個現象,要對指標的概念有比較正確的認識。