我正在接受朋友给我的挑战,为了完成它,我需要在没有先前声明的情况下将可变字符串传递到一个函数中。(该函数对字符串执行一些操作,因此它必须是可变的,并且由于挑战的限制,我不能在函数调用之前声明变量。基本上可以
myFunction("abcdef");
可以通过两种方式来修改字符串,一种是在函数调用时声明并传递字符串,另一种是在非可变内存中不声明传递的字符串。
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#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;
}
std::string
参数就可以了吗?http://ideone.com/XFbKaZ - Oliver Charlesworthnew char[]{"abcdef"}
可能会“起作用”,但不行,绝对不行。 - chrismyfunction(std::string("ABC").data());
- Kerrek SBmyfunction(&std::string("ABC")[0]);
,这应该可以工作,因为[]
运算符没有 lvalue 限定。 - Kerrek SB