C++ 我说得对吗&;str[0]指向len+;1个大小,包括空终止字符

C++ 我说得对吗&;str[0]指向len+;1个大小,包括空终止字符,c++,c++11,winapi,C++,C++11,Winapi,可以执行以下操作吗 auto len = GetWindowTextLengthA(min_area_edit_hwnd); std::string buffer(len, '\0'); GetWindowTextA(min_area_edit_hwnd, &buffer[0], len + 1); 我的意思是,告诉GetWindowTextA函数&buffer[0]指向大小为len+1的缓冲区可以吗?这是正确的还是我应该用下面的方法创建字符串 std::string buffer(l

可以执行以下操作吗

auto len = GetWindowTextLengthA(min_area_edit_hwnd);
std::string buffer(len, '\0');
GetWindowTextA(min_area_edit_hwnd, &buffer[0], len + 1);
我的意思是,告诉
GetWindowTextA
函数
&buffer[0]
指向大小为
len+1
的缓冲区可以吗?这是正确的还是我应该用下面的方法创建字符串

std::string buffer(len + 1, '\0');

函数将写入提供的缓冲区。在C++11和C++14中,写入
std::string
的字符串内容超出范围是未定义的行为,即使您在空终止符上写入空终止符也是如此


在进行调用之前,您需要将字符串大小调整为
len+1
,然后根据返回值再次调整字符串大小。

GetWindowTextA函数将写入提供的缓冲区。在C++11和C++14中,写入
std::string
的字符串内容超出范围是未定义的行为,即使您在空终止符上写入空终止符也是如此


在进行调用之前,需要将字符串的大小调整为
len+1
,然后根据返回值再次调整字符串的大小。

&(缓冲区[0])有一个char*类型,可能指向长度为len的文本,但即使这样也不能保证。您应该使用
字符缓冲区[len+1]

&(缓冲区[0])有一个char*类型,可能指向长度为len的文本,但即使这样也不能保证。您应该使用
字符缓冲区[len+1]取而代之。

从C++11开始这通常是合法的,但是您确实必须为空终止符保留一个额外的字符


在C++11之前,
std::string
的这种用法是非法的。但是,请注意,<代码>缓冲区>长度()/代码>不会自动更新,只是因为<代码> GETWOWOWTEXTA<代码>在控制序列的中间放置了一个<代码> 0 。如果您希望字符串的C长度与
buffer.length()
一致,则您有责任相应地调整
缓冲区的大小()

从C++11开始这通常是合法的,但您确实必须为空终止符保留一个额外的字符


在C++11之前,
std::string
的这种用法是非法的。但是,请注意,<代码>缓冲区>长度()/代码>不会自动更新,只是因为<代码> GETWOWOWTEXTA<代码>在控制序列的中间放置了一个<代码> 0 。如果您希望字符串的C长度与
buffer.length()
一致,则您有责任相应地调整
resize()
您的
缓冲区的大小。

char cbuffer[MAX_LEN_OF_SOME_DESCRIPTION];
GetWindowTextA(..., cbuffer, ...);
cbuffer[len] = '\0';
std::string buffer(cbuffer); // assuming you actually NEED a C++ string.

此方法将不必分析相当多的C++标准文档,以确定是否直接写入<代码>字符串对象是合法的:-(<

< P>)我倾向于错误地提醒自己:

char cbuffer[MAX_LEN_OF_SOME_DESCRIPTION];
GetWindowTextA(..., cbuffer, ...);
cbuffer[len] = '\0';
std::string buffer(cbuffer); // assuming you actually NEED a C++ string.

此方法不必分析相当多的C++标准文档来确定是否直接写入字符串对象是合法的:-(<

< P>)从标准的角度来看,保证如下:

  • 基本字符串是一个连续的容器
  • 运算符[](std::size\u t)
    不会使迭代器无效
  • 读取[0,size()]范围内的任何元素是合法的,您可以修改任何此类元素,但
    运算符[](size())返回的元素除外。
因此,我认为,只要函数不急于编写空终止符(即检查它是否已经以
'\0'
结尾,它总是这样做,然后什么也不做),就可以这样做。另外,我只听说过一个字符串的实例被实现,这会导致真正的麻烦,那就是Facebook的实现


就我个人而言,如果不能严格控制访问,我会选择更安全的路径,并将大小设置为长一个字节,这样我就不会传递
len+1
的大小


编辑:从另一个答案下的注释来看,不正确处理(可能未分配)空终止符可能会导致实际故障,请参见

,从标准的角度来看,以下是可以保证的:

  • 基本字符串是一个连续的容器
  • 运算符[](std::size\u t)
    不会使迭代器无效
  • 读取[0,size()]范围内的任何元素是合法的,您可以修改任何此类元素,但
    运算符[](size())返回的元素除外。
因此,我认为,只要函数不急于编写空终止符(即检查它是否已经以
'\0'
结尾,它总是这样做,然后什么也不做),就可以这样做。另外,我只听说过一个字符串的实例被实现,这会导致真正的麻烦,那就是Facebook的实现


就我个人而言,如果不能严格控制访问,我会选择更安全的路径,并将大小设置为长一个字节,这样我就不会传递
len+1
的大小


编辑:根据另一个答案下的注释,不正确处理(可能未分配)空终止符可能会导致实际故障,请参见标准,这是不安全的。该标准做出了相当大的努力,明确指出写入NUL终止符是未定义的行为:


更难分析的是
&buffer[0]
是否以
size()+1
连续字符开头。本标准并未明确做出此保证,事实上,上面引用的
operator[]
的措辞似乎是