我寫這套短節目設置的char *的結束手動不起作用
int main(){
char * c = "abcd";
c[1] = '\0';
cout << c << endl;
}
,它不工作...其實它編譯程序,但在錯誤occures運行時... 爲什麼?我認爲它會打印一個「a」,因爲「string」現在看起來像這樣:「a0cd」,所以在零後應該檢測到字符串的結尾,對吧?那麼問題在哪裏?
謝謝!
我寫這套短節目設置的char *的結束手動不起作用
int main(){
char * c = "abcd";
c[1] = '\0';
cout << c << endl;
}
,它不工作...其實它編譯程序,但在錯誤occures運行時... 爲什麼?我認爲它會打印一個「a」,因爲「string」現在看起來像這樣:「a0cd」,所以在零後應該檢測到字符串的結尾,對吧?那麼問題在哪裏?
謝謝!
您不能像這樣修改字符串文字。
試試這個:
int main(){
char c[] = "abcd";
c[1] = '\0';
cout << c << endl;
}
這背後的原因是,字符串字面存儲在全局內存(通常在一個只讀段)。修改它們是未定義的行爲。但是,如果將它初始化爲數組char c[] = "abcd"
它將在堆棧上(與全局內存相對),因此您可以自由修改它。
如果你使用C++爲什麼不使用std::string::substr?
#include <iostream>
#include <string>
int main() {
std::string c = "abcd";
std::string d = c.substr(0,2);
std::cout << d << std::endl;
return 0;
}
程序的輸出:
ab
是的,我知道它也是這樣工作的,但我真的想嘗試它「低級別的方式」,看它是如何在語言的核心實際工作的... – Novellizator
@Tomy:有趣的是,因爲95%的人認爲std :: string是爲C++跳過c的主要原因之一。字符串操作大多不是時間關鍵的,C字符串API非常模糊。 – Alex
實際上,我在C++的代碼,我使用std :: string - 我的問題只是出於好奇 - 沒有更多:)謝謝反正 – Novellizator
謝謝。那麼究竟是什麼問題呢?你知道爲什麼不是的根本原因嗎? – Novellizator
我已將原因編輯爲我的答案。 – Mysticial
C標準對堆棧和全局內存沒有什麼可說的,這是一個實現問題。說明標準不允許修改字符串文字就足夠了。 – paxdiablo