2013-12-22 48 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; 
}