最近碰到乙個很奇怪的問題,想想關了電腦也要再開機記錄下來
主要**如下:
int main()
要從控制台中讀取輸入的字串,定義了乙個char*型別的陣列,結果出問題了。
當輸入: whos who輸出:whoswho
當輸入: wwwwww dddddd輸出:wwwwdddddd
有多糾結我就不說了,和同學討論了好久得出結論(可能有誤)
char* 在c語言中佔四個位元組,因為定義的key是個陣列,在宣告時為它分配一塊連續的記憶體,於是陣列key的每個單元都被固定成四個位元組。
對於第一種情況,whos正好佔了四個位元組,最後的終結符(記得是\0)越界放到了key[1]裡,隨後被寫入key[1]記憶體位址的資料覆蓋掉了,於是系統不知道key[0]到什麼地方結束,一直往後讀,直到遇到了key[1]的終結符,所以把key[1]一塊輸出了。
對於第二種情況也類似,6個w放到4個位元組裡放不下,只能存放前四個,後面兩個越界放到了key[1]裡,隨後被寫入key[1]記憶體位址的資料覆蓋掉了。雖然後面的6個d也超出了範圍,但是這個陣列只有兩個長度的大小,key[i]只是記錄了首位址,並沒有記錄結束位置的位址,於是這6個d把為這個陣列分配的8個位元組記憶體的後面一部分記憶體給占用了,所以最後乙個字串完整的輸出了。
假設還是定義key的長度為2,但是只讀取了乙個字串,不管它長度多大,都能完整輸出,因為它越界的部分沒有被覆蓋掉。
因此,對於這種輸入的字串大於4個位元組的情況,只有輸入的最後乙個字串能完整的輸出。
C 讀取字串
我們在使用鍵盤輸入字串的時候,輸入流對於字串的讀取有幾種不同的實現方式。cin cin 在讀取字串時使用空白 空格 製表符和換行符 來確定字串的結束位置,這說明cin在獲取字元陣列輸入時只能讀取乙個單詞。而讀取該單詞後,cin將該字串放到陣列中,並在結果自動新增空字元。so,在某些時候,我們需要使用...
讀取字串長度
c 關於讀取乙個字串長度 包括空格回車 自用 方法1 include include using namespace std intmain 方法2 include include include include include using namespace std intmain 方法3 inc...
C 取字串中間文字 取字串左邊 取字串右邊
好像是第二種效率高一點,取str字串中123左邊的所有字元 第一種between str,123 而第二種是between str,null,123 public static string between string str,string strleft,string strright 取文字中...