我通過一個朋友給我一個挑戰工作,去完成它,我需要一個可變的字符串傳遞到功能,無需事先聲明。 (該功能瓶坯一些操作上的字符串,所以它必須是可變的,並且由於在挑戰限制,我不能宣佈在函數調用前的變量,基本上可以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