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

时间:2013-12-22 03:46:25

标签: c++ string

我正在处理一个朋友给我的挑战并完成它我需要将一个可变字符串传递给一个函数,而无需事先声明。 (该函数对字符串执行一些操作,因此它必须是可变的,并且由于挑战中的约束,我不能在函数调用之前声明变量。基本上可以

myFunction("abcdef");

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

2 个答案:

答案 0 :(得分:4)

这是一个将呼叫更改为

的版本
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段)。

答案 1 :(得分:1)

这是一种简单的方法。

#include <iostream>
using namespace std;   

void MyFunc(char* c)
{
    c[0] = 's'; 
    cout << c << endl;
    delete[] c;
}

int main()
{
   MyFunc(new char[3]{'a','b', 0});

   return 0;
}