字串是 "" 號賦值的
例:char a=
"hello"
;//長度為6 最後加了乙個 ' \0 '
或char a[6]
="hello"
;
字串會自動的在最後加乙個'\0'的結束符,
字元陣列是乙個乙個的賦值
例:char a[5]
=;//長度為5 不會自動的加 ' \0 '
%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 '
由上我們可以看出是真的有 』 \0 '.
通過上面的例子我們可以直到:
也就是說跟定義時分配的空間大小毫無關係了?
不管空間小於字串長度,還是大於字串長度,總之只要最後printf
()和puts
()沒有獲取到『\0』
這兩個函式就會繼續讀取給定空間之外的變數,因為這個變數是隨機的,不可預知的,所以很多時候就會是亂碼。
我們接著上面的例子:
講一講溢位
我們給 a[
5] 賦值了這明顯溢位了但是確實可以的這是為何 ?
首先,陣列越界它並不會造成編譯錯誤!就是說,c,c++的編譯器並不判斷和指出你的**「訪問越界」了。
乙個明明是錯誤的東西,就這樣「順利」地通過了編譯,陣列訪問越界在執行時,它的表現是不定的,
有時似乎什麼事也沒有,程式一直執行(當然,某些錯誤結果已造成);有時,則是程式一下子崩潰。
因此在使用陣列時,一定要在程式設計中判斷是否越界以保證程式的正確性。
我們再看一下其他的陣列,例:整形陣列,實型陣列會不會越界出錯
由上總結:
再c/c++ 中所有的陣列都可以越界,可以執行但是可能會帶來一些奇怪的問題
陣列越界好比闖紅燈,不是每次都會被撞死,但是能不能活下來全賴人品。c語言不會對越界做檢查,是否出錯,
全看你有沒有寫入到某個記憶體位址,這個位址恰好存放重要的資料。
以下就是乙個陣列越界出現錯誤的例子
陣列越界問題
字串和字串陣列
字串陣列 include int main int argc,const char ar printf name1 s n name1 name1 zhangsan 部分初始化中,沒有被初始化的元素預設是0,0 對應的ascii值是 0 char name2 9 printf name2 s n n...
字串和字元陣列
void test1 函式test1中,指標str1所指向的字串有11個元素。一定要注意字串是以 0 為結尾的,而strcpy拷貝了整個字串包括 0 所以存在下標越界的問題。void test2 函式test2中,字元陣列str1包含10個元素。陣列str1並不是以 0 結束,所以不能作為字串使用。...
字串和字元陣列
字串的定義 字串是零個或多個組成的有限序列,只包含空格的串成為空格串。串中所包含的字元個數成為串的長度,長度為0的串為空串,記作 字串中任意個連續的字元組成的子串行稱為該串的子串,相應地,包含子串的串稱為主串,子串的第乙個字元在主串的序號成為子串在主串的位置。字串的比較 當下列條件之一成立時,稱x ...