1. 程式人生 > >c語言輸出笑臉('\1')

c語言輸出笑臉('\1')

c語言輸出笑臉(’\1’)

這裡寫圖片描述

就如上圖,在程式編譯執行之後,輸出了笑臉符號,可是在別人的電腦中又沒有顯示出這個錯誤。也就是說同樣的程式碼,同樣的編譯器,卻顯示不同的內容。
- 笑臉:’\1’ (有的編譯器是顯示空格或者一個正方形框)
- 縮寫/字元:SOH(start of headline)
- 解釋:標題開始
經過google,發現是因為strlen函式的原理導致了這種數值溢位的現象。

strlen函式的實現原理類似這個:

    #include <stdlib.h>
    size_t strlen( char *string )
    {
        int
length = 0; // 依次訪問字串的內容,計算字元數,直至遇到NUL終止符 while( *string++ != '\0' ) length += 1; return length; }

兩點注意:

  • size_t 為stddef.h中定義的資料型別,等價於 unsigned int,它的取值必須大於等於0。
  • while()迴圈條件中,string++等價於(string++)。string是指標變數,儲存的是字串的起始地址(第一個字元的地址),地址是一個整數,可以進行算術運算,加 1 後為下一個字元的地址。

在指標到達字串末尾的NUL位元組之前,while語句中*string++表示式的值一直為真。它同時增加指標的值,用於下一次測試。這個表示式甚至可以正確地處理空字串。

如果這個函式呼叫時傳遞給它的是一個NULL指標,那麼while語句中的間接訪問將會失敗。函式是不是應該在解引用指標前檢查這個條件?從絕對安全的角度講,應該如此。但是,這個函式並不負責建立字串。如果它發現引數為NULL,它肯定發現了一個出現在程式其他地方的錯誤。 當指標建立時檢查它是否有效是合乎邏輯的,因為這樣只需檢查一次。這個函式採用的就是這種方 法。如果函式失敗是因為粗心大意的呼叫者懶得檢查引數的有效性而引起的,那是他活該如此。

所以,使用strlen()函式之前一定要確保字串不為NULL。而字串的儲存方式跟一個char型陣列類似。

所以在用strlen函式的時候,要確保該陣列或者字串有結束標誌’\0’

不同電腦不同輸出沒搞懂,希望能有留言解答一下我的疑惑~