簡體   English   中英

將read()內容傳遞給C ++字符串類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM