字串和字元陣列

2021-10-05 19:10:40 字數 2411 閱讀 2134

字串是 "" 號賦值的

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