字符串和字符数组
字符串和字符數組
- 字符串
- 字符數組
- 關于%s的問題
- 字符越界和出現亂碼問題
- 溢出
字符串
字符串是 "" 號賦值的 例: char a[]="hello";//長度為6 最后加了一個 ' \0 ' 或 char a[6]="hello"; 字符串會自動的在最后加一個'\0'的結束符,字符數組
字符數組是一個一個的賦值 例:char a[5]={'1','2','3','4','5'};//長度為5 不會自動的加 ' \0 '關于%s的問題
%s它要求參數是一個指針!!!即: 要求 char * 類型 %s 字符串的格式輸出, 它是一個接一個挨著輸出, 直到遇見'\0'才中止 當我們用scanf() 用到%s 時 它會自動的在最后加 '\0' 當我們用printf() 用到%s 時 它會一個接一個挨著輸出, 直到遇見'\0'才中止字符越界和出現亂碼問題
我們可以看到出現了亂碼,這是為何? 首先我們的字符數組里沒有 \0 ,而printf() %s 是直到 \0 才結束 這就說明查找 '\0' 越界了, 即亂碼 ' 口 ' 之后是 ' \0 ' 即: 12345燙蘰 \0 我們的想法對不對呢? 看下圖 我們由上圖可以看到,沒有了亂碼。 這是因為scanf() %s 會自動的在最后加 ' \0 '也就是5后面加' \0 ', 即12345后面就是 '\0' 所以沒有了亂碼。運行原理如下:
由上我們可以看出是真的有 ’ \0 '.
溢出
我們接著上面的例子: 講一講溢出 我們給 a[5] 賦值了這明顯溢出了但是確實可以的這是為何 ? 首先,數組越界它并不會造成編譯錯誤!就是說,C,C++的編譯器并不判斷和指出你的代碼“訪問越界”了。 一個明明是錯誤的東西,就這樣“順利”地通過了編譯,數組訪問越界在運行時,它的表現是不定的, 有時似乎什么事也沒有,程序一直運行(當然,某些錯誤結果已造成);有時,則是程序一下子崩潰。 因此在使用數組時,一定要在編程中判斷是否越界以保證程序的正確性。 我們再看一下其他的數組,例:整形數組,實型數組會不會越界出錯 由上總結: 再c/c++ 中所有的數組都可以越界,可以運行但是可能會帶來一些奇怪的問題 數組越界好比闖紅燈,不是每次都會被撞死,但是能不能活下來全賴人品。C語言不會對越界做檢查,是否出錯, 全看你有沒有寫入到某個內存地址,這個地址恰好存放重要的數據。 以下就是一個數組越界出現錯誤的例子
數組越界問題
總結
- 上一篇: 如何转载别人的CSDN文章
- 下一篇: C语言易错题集 第二部