2009-09-11 81 views

回答

1

有時,您需要訪問格式爲字符數組的字符串 - 通常是因爲您需要將字符串傳遞給某個需要字符串的函數(例如strcmp)。您可以通過使用datac_str成員做到這一點,但你必須尊重調用它們在你提供的鏈接清楚地闡明的功能的規則:

返回數組指向一個 內部位置,其不應該在程序中直接修改 。其 內容保證保持 不變,直到 的下一個 字符串對象的非常數成員函數爲止。

您不能修改字符數組 - 字符串對象假定您沒有,如果這樣做會導致未定義的行爲。

5

它們表示您可以存儲指針並稍後使用它。如果在兩次訪問之間調用某個非const方法,則存儲的指針所設置的緩衝區內容可能會更改,並且您將面臨意外行爲。

4
const char* data() const; 

這是說,const char *通過調用str.data()不會改變,除非有人修改了它來自返回的字符串。一旦有人調用非常量成員函數,返回的指針可能無效,或者可能指向與返回後立即指向的數據不同的數據。例如,您可以將返回的數據傳遞給C函數。這意味着你不應該這樣做:

const char *old = str.data(); 
size_t  len = str.length(); 
...call a function that modifies str... 
// cout << old << endl; 
// Since old is not guaranteed to be null terminated (thanks MSalter), 
// do something else with the old data instead of writing to cout. 
// Inventiveness not at a high this morning; this isn't a particularly 
// good example of what to do - a sort of string copy. 
char buffer[256]; 
memcpy(buffer, old, MIN(sizeof(buffer)-1, len)); 
buffer[len] = '\0'; 

由當時的 I/O 內存複製完成後,old可能不再有效多了,也len可能是不正確的。

+1

此外: 通常對字符串的操作會導致包裝在字符串中的c字符串發生更改。由於像append這樣的操作需要重新分配c-string,因此之前的內存位置被釋放並且不再使用。 – Basilevs 2009-09-11 07:00:05

+0

「通常」是重要的詞,因爲std :: string的一些實現不包裝C字符串(最常見的異常是在包裝的char []中沒有\ 0) – MSalters 2009-09-11 09:46:56

+0

哦,該示例是錯誤的BTW:cout需要以空字符結尾的字符串,而data()通常不是。 – MSalters 2009-09-11 09:47:47

相關問題