gpt4 book ai didi

C++ 在可变内存中声明一个字符串文字

转载 作者:太空狗 更新时间:2023-10-29 20:41:36 29 4
gpt4 key购买 nike

我正在应对一个 friend 给我的挑战,为了完成它,我需要在没有事先声明的情况下将一个可变字符串传递给一个函数。 (该函数对字符串进行了一些操作,因此它必须是可变的,并且由于挑战中的限制,我无法在函数调用之前声明变量。基本上可以

myFunction("abcdef");

以在函数调用中声明并传递字符串的方式进行更改,或者不在非可变内存中声明传递的字符串。

最佳答案

这是一个将调用更改为的版本

myFunction("abcdef"_ncs);

我想,这种对“非常量字符串”的无辜添加应该是允许的。这是代码:

#include <cstring>
#include <cstddef>
#include <iostream>

void myFunction(char* x) {
std::cout << "x=" << x << "\n";
}

struct tmp_string {
char* buffer;
tmp_string(char const* str, std::size_t n)
: buffer(std::strcpy(new char[n + 1], str)) {
}
tmp_string(tmp_string&& other): buffer(other.buffer) { other.buffer = 0; }
~tmp_string() { delete[] buffer; }
operator char*() { return buffer; }
};

tmp_string operator"" _ncs(char const* str, std::size_t n) {
return tmp_string(str, n);
}

int main()
{
myFunction("abcdef"_ncs);
}

我没有使用 std::string 主要是因为没有从 std::string 到非 const 的巧妙转换> 字符串。我能想到的唯一方法是

myFunction(&std::string("abcdef")[0]);

至少,它自己也会干净地清理(就像上面使用 tmp_string 的方法一样)。请注意,从 C++11 开始,采用第一个字节地址的方法也会产生一个以空字符结尾的字符串(对于 C++03,该字符串不能保证以空字符结尾;因为我无法验证此保证:它在 21.4.5 [string.access] 第 2 段)。

关于C++ 在可变内存中声明一个字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20726050/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com