C++中如何声明一个可变内存中的字符串字面量

3

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

myFunction("abcdef");

可以通过两种方式来修改字符串,一种是在函数调用时声明并传递字符串,另一种是在非可变内存中不声明传递的字符串。


4
让你的函数接受一个 std::string 参数就可以了吗?http://ideone.com/XFbKaZ - Oliver Charlesworth
这个函数旨在接受一个字符数组并进行大量指针操作,因此如果参数保持为字符指针,则会更容易。我能否声明一个字符串,然后将其转换回字符数组? - Gibby
2
我想new char[]{"abcdef"}可能会“起作用”,但不行,绝对不行。 - chris
myfunction(std::string("ABC").data()); - Kerrek SB
2
@KerrekSB: 但那不是可变的,对吧? - Oliver Charlesworth
@OliCharlesworth:啊,对了。所以应该是 myfunction(&std::string("ABC")[0]);,这应该可以工作,因为 [] 运算符没有 lvalue 限定。 - Kerrek SB
2个回答

4
这里是一个版本,更改了调用方式。
myFunction("abcdef"_ncs);

我猜,这个针对“非const字符串”的无害添加应该是允许的。以下是代码:

#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段中)。

世界上的operator""是什么? - ApproachingDarknessFish
1
@ValekHalfHeart:它被称为“字面运算符”,用于创建用户定义的字面量。您可以将后缀附加到整数、浮点数或字符串字面量上,从而调用此运算符。 - Dietmar Kühl

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接