2013-12-22 49 views
3

我通过一个朋友给我一个挑战工作,去完成它,我需要一个可变的字符串传递到功能,无需事先声明。 (该功能瓶坯一些操作上的字符串,所以它必须是可变的,并且由于在挑战限制,我不能宣布在函数调用前的变量,基本上可以c + +中可变的内存声明一个字符串字面

myFunction("abcdef"); 

以这样的方式来改变该字符串在函数调用中声明,并通过或使传递的字符串中的非可变的内存不宣。

+4

只要你的函数采取'std :: string'? http://ideone.com/XFbKaZ –

+0

这个函数被设计为接受一个char数组,并且执行了大量的指针操作,所以如果参数仍然是一个char指针,它会更容易,我可以声明一个字符串,然后将其转换回一个char数组? – Gibby

+2

我想'新的字符[] {“abcdef”}'会“工作”,但不,只是没有。 – chris

回答

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开始,采用第一个字节地址的方法也会产生以null结尾的字符串(对于C++ 03,字符串不保证以null结尾;因为我无法验证此保证:它在21.4.5 [string.access]段落2)。

+0

完美地工作,谢谢。 – Gibby

+0

世界上有什么是'运营商'“'? – ApproachingDarknessFish

+1

@ValekHalfHeart:它被称为_literal-operator_,用于创建用户定义的文字。您可以将后缀附加到调用此运算符的整数,浮点或字符串文字。 –

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