[英]Pass read() contents to C++ string type
我使用mystr.c_str()函數來調用需要char *參數的write(),open()等系統調用。 雖然因為.c_str()的性質是一個函數,我認為調用read(rfd,&mystr.c_str(),mystr.lenght())是行不通的。 沒有臨時使用char * str的最佳/快速實現方法是什么?
你不能直接寫入std::string
的緩沖區,因為它只返回指向只讀字符串1的 char指針。 考慮使用本地數組作為緩沖區。 這與您可以在不調用未定義行為的情況下獲得的最佳效果相同。
const int BUFFER_SIZE = 1024;
char buffer[BUFFER_SIZE];
ssize_t chars_read = read(rfd, buffer, BUFFER_SIZE);
if (chars_read > 0) {
// To create a new string:
std::string read_string(buffer, chars_read);
// To populate an existing string:
existing_string.assign(buffer, chars_read);
}
1至少預先C ++ 11。 在C ++ 11中,使用&some_string[0]
來獲取指向字符串的可變指針是安全的,但是你應該確保不要寫入&some_string[some_string.size()]
或更高版本,因為這會調用UB ,所以你想首先resize()
字符串的resize()
。
這是不允許的,但是對於大多數(如果不是全部) string
實現,它將主要用於(使用const_cast
),盡管一些實現將具有非常非常令人驚訝的副作用。
因為不允許直接寫入c_str()
返回的字符串,所以允許以各種方式優化字符串的實現。 string
I的一個特定實現是內部使用引用計數指針進行復制(僅當字符串的大小很大時)。 因此,如果您復制字符串然后非法覆蓋它的內容,原始和副本都會更改。
即使您當前使用的string
實現仍然存在這種濫用,它可能會在以后更改,此時程序會以奇怪的方式神奇地開始工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.