2010-11-09 74 views

回答

48

strlen通常通過計數字符串中的字符直到找到\0字符。規範實施將是:

size_t strlen (char *str) { 
    size_t len = 0; 
    while (*str != '\0') { 
     str++; 
     len++; 
    } 
    return len; 
} 

該函數沒有固有的錯誤,它的工作原理與文檔完全一樣。

這並不是說沒有問題,即:

  • 如果你傳遞一個「串」不,在年底有一個\0,你可能會碰到的問題,但在技術上,那不是C字符串(a),這是你自己的錯。
  • 你不能在你的字符串中放入\0個字符,但是,在這種情況下,它又不會是C字符串。
  • 這不是最有效的方法 - 你可以在前面儲存長度,這樣你可以更快地獲得長度。

但這些都不是bug,它們只是設計決定的結果。

另請參見Joel Spolsky編寫的this excellent article,他討論了各種字符串格式及其特性,包括普通的C字符串,Pascal字符串以及兩個空終止的Pascal字符串的組合,儘管他擁有更多,我們應該說「多彩的」一詞爲他們:-)


的(a) AC串被定義爲後跟終止一系列非終止子的字符(即,除了\0任何其他)。因此,該定義不允許序列內的嵌入終止子和沒有這種終止子的序列。

或者,把它更簡潔地(根據ISO標準):

字符串是由封端的字符的連續序列,並且包括第一個空字符 。