相关疑难解决方法(0)

像sprintf一样的std :: string格式

我必须格式化std::stringsprintf,并将其发送到文件流.我怎样才能做到这一点?

c++ string formatting stl

412
推荐指数
17
解决办法
77万
查看次数

C++ 11中COW std :: string实现的合法性

据我所知,写时复制不是std::string在C++ 11中实现符合性的可行方法,但最近在讨论中我发现自己无法直接支持该语句.

我是否正确C++ 11不承认基于COW的实现std::string

如果是这样,这个限制是否在新标准(其中)的某处明确说明了?

或者这个限制是否暗示,因为新要求的综合影响std::string排除了基于COW的实施std::string.在这种情况下,我会对"C++ 11有效禁止基于COW的std::string实现" 的章节和样式推导感兴趣.

c++ string stdstring copy-on-write c++11

114
推荐指数
5
解决办法
2万
查看次数

有没有办法在不修改缓冲区内容的情况下设置std :: string的长度?

根据这些问题的答案中的陈述

..在C++ 11中应该可以调用一个C API函数,它接受一个char指针来存储输出,如下所示:

str::string str;
str.reserve(SOME_MAX_VALUE);
some_C_API_func(&str[0]);
Run Code Online (Sandbox Code Playgroud)

但是现在有一种合法的方法可以字符串的大小设置为缓冲区内(空终止的)内容的长度吗?像这样的东西:

str.set_size(strlen(&str[0]));
Run Code Online (Sandbox Code Playgroud)

这是一个非常不美观的滥用,std::string无论如何我听到你说,但我不能char在堆栈上创建一个临时缓冲区,所以我必须在堆中创建一个缓冲区并在之后销毁它(我想避免).

有一个很好的方法来做到这一点?也许不是保留,但事后调整和调用erase()会做到但是它感觉不好整洁..

char stdstring c++11

6
推荐指数
1
解决办法
4275
查看次数

使用 std::string::c_str() 修改底层 std::string 是否安全?

我遇到了一些代码,其中包含以下示例的几个实例:

std::string str = "This  is my string";
char* ptr = const_cast<char*>(str.c_str());

ptr[5] = 'w';
ptr[6] = 'a';
Run Code Online (Sandbox Code Playgroud)

在这个简化的例子中,有一个 的赋值std::string::c_str(),它返回const char*到一个char*使用的指针const_cast

这似乎按预期工作并相应地str进行了修改。

std::string::c_str()在我当地图书馆的描述如下:

返回指向空终止内容的常量指针。这是内部数据的句柄。不要修改,否则可能会发生可怕的事情

cppreference 中,描述包括:

返回一个指向空终止字符数组的指针,该数组的数据与存储在字符串中的数据等效。

...

写入通过访问的字符数组c_str()是未定义的行为。

在标准的[string.accessors]的descritpion是类似的,没有关于这个信息......空终止字符数组与等同于存储在所述字符串中的数据被提供。

这不是澄清问题,而是让我更加困惑,什么字符数组?它是如何等效的?是副本吗?如果是这样,为什么要修改它,还要修改原始字符串?这个实现定义了吗?

我想避免更改使用它的所有代码实例的任务,所以我的问题是:

有什么办法可以是正确的,使用ptr指针修改str字符串是否合法?

c++ stdstring const-cast c-str

1
推荐指数
1
解决办法
276
查看次数

标签 统计

c++ ×3

stdstring ×3

c++11 ×2

string ×2

c-str ×1

char ×1

const-cast ×1

copy-on-write ×1

formatting ×1

stl ×1