C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 使用&front()修改std :: string中的基础字符数组大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_616_0@
@H_616_0@
参见英文答案 > Why is modifying a string through a retrieved pointer to its data not allowed?                                    1个
我必须在我的一个程序中与C库接口,我正在编写一个瘦包装器来使用诸如std :: String之类的C类型.有许多函数接受char *和最大长度作为参数,并用零终止的C字符串覆盖char *指向的内存.传统上,我使用堆栈数组并手动将数据复制到字符串中.

std::string c@R_616_10636@C_function(int X) {
    char buf[MAX_LEN] = {0}; // MAX_LEN is defined by the library
    size_t len = MAX_LEN;
    C_function(x,buf,&len);
    return std::string(buf,len);
}

我试图避免副本并提出解决方案,但我不知道这是否严格合法:

std::string c@R_616_10636@C_function(int X) {
    std::string buf(MAX_LEN,'\0'); // MAX_LEN is defined by the library
    size_t len = MAX_LEN;
    C_function(x,&buf.front(),&len);
    buf.resize(len);
    return buf;
}

这编译和工作,但我有疑问,因为Std :: String类使得很难得到一个非const指针指向字符数据. c_str()和data()都返回const指针.该标准明确@L_944_8@对这些函数修改缓冲区:

从文档中看,这似乎是合法的,因为front()返回对缓冲区的第一个字符的引用,该字符必须是连续的(我使用的是C 11/14).在21.4.5中,front()的语义是根据operator [](0)定义的,它不@L_944_8@修改.

从语言标准的角度来看,这种方法有什么问题吗?似乎这将是一个循环漏洞,允许在21.4.7.1中明确@L_944_8@修改.

解决方法

据我读到的C 11:

我们来看看operator []:

由于您预先分配了缓冲区,因此pos将小于size(). begin()返回一个迭代器,因此所有常用的迭代器特性都适用.

因此,根据我对C 11的解释,这种方法应该是合法的.

@H_616_0@

大佬总结

以上是大佬教程为你收集整理的c – 使用&front()修改std :: string中的基础字符数组全部内容,希望文章能够帮你解决c – 使用&front()修改std :: string中的基础字符数组所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:cstdstring使用修改基础字符数组
猜你在找的C&C++相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap