我正在使用mystr.c_str()函数来调用需要char *参数的write(),open()等系统调用。虽然因为.c_str()的性质,我认为调用read(rfd,& mystr.c_str(),mystr.lenght())是行不通的。在没有临时使用char * str的情况下实现此目的的最佳/快速方法是什么?
答案 0 :(得分:2)
你不能直接写入std::string
的缓冲区,因为它只会返回指向只读字符串 1 的字符串指针。考虑使用本地数组作为缓冲区。这与您在不调用未定义行为的情况下一样最佳。
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()
字符串。
答案 1 :(得分:0)
这是不允许的,但对于const_cast
的大多数实现,大多数大多数都会工作(使用string
),尽管某些实现会非常令人惊讶副作用。
因为不允许直接写入c_str()
返回的字符串,所以允许以各种方式优化字符串的实现。 string
的一个特定实现我在内部使用引用计数指针进行复制(仅当字符串的大小很大时)。因此,如果你复制字符串然后非法覆盖它的内容,原始和副本都会改变。
即使您当前正在使用的string
实施仍然存在此类滥用行为,它可能会在以后更改,此时程序会以奇怪的方式神奇地开始工作。