我通过一个朋友给我一个挑战工作,去完成它,我需要一个可变的字符串传递到功能,无需事先声明。 (该功能瓶坯一些操作上的字符串,所以它必须是可变的,并且由于在挑战限制,我不能宣布在函数调用前的变量,基本上可以c + +中可变的内存声明一个字符串字面
myFunction("abcdef");
以这样的方式来改变该字符串在函数调用中声明,并通过或使传递的字符串中的非可变的内存不宣。
我通过一个朋友给我一个挑战工作,去完成它,我需要一个可变的字符串传递到功能,无需事先声明。 (该功能瓶坯一些操作上的字符串,所以它必须是可变的,并且由于在挑战限制,我不能宣布在函数调用前的变量,基本上可以c + +中可变的内存声明一个字符串字面
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开始,采用第一个字节地址的方法也会产生以null结尾的字符串(对于C++ 03,字符串不保证以null结尾;因为我无法验证此保证:它在21.4.5 [string.access]段落2)。
完美地工作,谢谢。 – Gibby
世界上有什么是'运营商'“'? – ApproachingDarknessFish
@ValekHalfHeart:它被称为_literal-operator_,用于创建用户定义的文字。您可以将后缀附加到调用此运算符的整数,浮点或字符串文字。 –
这是一个简单的方法来做到这一点。
#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 –
这个函数被设计为接受一个char数组,并且执行了大量的指针操作,所以如果参数仍然是一个char指针,它会更容易,我可以声明一个字符串,然后将其转换回一个char数组? – Gibby
我想'新的字符[] {“abcdef”}'会“工作”,但不,只是没有。 – chris