2013-06-28 96 views
4

最近幾天我一直在教自己C++,爲大一作爲CS專業做準備。我現在使用C風格的字符串,並且想知道空終止符是什麼。爲什麼需要空終止符?

我明白這是必要的,但我想我只是不能從根本上理解爲什麼字符串不會僅僅結束它的最後一個字符。

+3

你怎麼知道最後一個字符是什麼? – SLaks

+1

你需要一個商定的最後一個字符,在C中它是一個0字節。在ASM中,它通常是一個$ char。你知道最後一個字符,但編譯器怎麼知道你在想什麼? – 2013-06-28 18:30:26

回答

17

我只是不能從根本上理解爲什麼一個字符串不會僅僅結束它的最後一個字符。

有知道哪裏是「最後一個字符」的幾種方式:

  1. 存儲指示最後從字符串的字符分別在字符串中的字符數,
  2. 將一個標記字符串的字符,或者
  3. 將指針存儲到與字符串字符分開的字符串的最後一個字符。

C選擇第二條路線;其他語言(帕斯卡爾等)選擇第一條路線。 C++ std::string的一些實現選擇第三條路線*


*即使 std::string使用第一種或第三種方法的實現方式爲了與庫的C部分兼容,將它們的緩衝區終止爲空。這是確保 c_str()返回有效的C字符串所必需的。

+1

4.使所有字符串固定大小的數組,可能填充空格。但是這種瘋狂只能在Fortran中忍受。 – cmaster

+0

我認爲應該指出,即使C++'string'出於效率的原因通常使用第一個解決方案(或第三個解決方案),以便在每次需要時不必重新計算字符串長度,它仍然會使用第二種解決方案也是爲了保持字符串與C API兼容(假設「字符串」不包含空字符,與'string :: size()'相比,它與C++'string'合法,但縮短了'strlen')。 - 至少在調用'string :: c_str()'時(即使大多數實現可能只在字符串大小發生變化時才寫入空終止符)。 – syam

+0

@syam這是一個很棒的評論,我編輯了包含它的答案。謝謝! – dasblinkenlight

0

因爲c樣式的字符串不知道什麼字符是最後一個字符。例如,如果你正在閱讀的名稱,你可以打一個緩衝區,像這樣:

char buf[256] // this allows c-style strings that contain 255 characters 

但是當你去填充該緩衝區,你可能不會(可能不會)使用的所有空間。如果用「Jack」填充它,則唯一關心的是前五個索引,而不是全部256.

2

在C和C++中,c字符串存儲在字符數組中。爲了允許不同長度的字符串,這些數組通常被分配得比它們要包含的實際字符串大得多。例如,程序員可以分配一個char[256]數組,該數組可以包含長度爲0到255之間任意長度的字符串。但計算機必須能夠確切地知道字符串實際上有多長,因此它必須以null字符。否則,需要字符數組長度與字符串完全相同(一種不切實際的解決方案,因爲分配和複製內存使用了大量資源)。

0

將字符串的每個字符視爲內存中的內存塊。 如果一個字符串放在內存中。之後,另一個字符串被放置在它的旁邊,那麼計算機會認爲第二個字符串與第一個字符串相連,如果null不存在的話。所以,null作爲分隔符