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

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

參考博客strlen()函數的實現原理

這裏寫圖片描述

就如上圖,在程序編譯執行之後,輸出了笑臉符號,可是在別人的電腦中又沒有顯示出這個錯誤。也就是說同樣的代碼,同樣的編譯器,卻顯示不同的內容。
- 笑臉:’\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’

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

發佈了35 篇原創文章 · 獲贊 44 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章