![](/img/trans.png)
[英]How to pass array to function without variable instantiation, in C++
[英]How to pass character array to a function in C++ without any temporary char array as variable?
我有以下代碼
void func(char c[]) {
c[1]= '@';
std::cout<<c<<"\n"
<<sizeof(c)<<"\n";
}
// Main 1
int main() {
char temp[6] = "pinta";
func(temp);
}
在這里,如果我將主要功能更改為以下內容
//Main 2
int main()
{
func("pinta");
}
meow@vikkyhacks ~/Arena/c/LinkedList $ g++-4.8 scrap/test.cpp
scrap/test.cpp: In function ‘int main()’:
scrap/test.cpp:12:14: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
func("pinta");
^
經過一番谷歌搜索后,我了解到第二個main
函數沒有傳遞任何字符數組,而是傳遞了一個read only string literal
,當擊中c[1] = '@'
會拋出段錯誤。
我的問題是
“ 如何避免使用Main 1
使用的temp
變量,而是直接將一個字符數組作為參數傳遞給func
? ”
重要條件是允許編輯傳遞到func
中的字符數組。
我看到有很多答案使我無法執行c[1]= '@';
,因為那條線對我來說很重要,所以我不能這樣做。
您無法避免創建一個臨時文件,因為寫一個字符串文字的內存是非法的,但是您可以讓編譯器為您創建它。 以參數std::string
代替-這比char
數組安全得多,並且會為您創建一個副本。
一種方法是:
template<int N>
void func(char const (&c)[N])
{
// c[1] = '@'; you cannot assign to variable that is const
std::cout << c << "\n"
<< sizeof(c) << "\n";
}
int main()
{
func("pinta");
return 0;
}
但是請注意,您僅將臨時對象綁定到const引用。
在上面,您實際上是傳遞了對數組的引用,該數組的大小與所提供的字符串文字的長度+ 1(= \\0
)一樣大。
如果在func
內需要一個可修改的變量,則需要一個char
數組的副本:
template<int N>
void func(char const (&c)[N])
{
char cp[N];
copy(begin(c), end(c), cp);
auto len = distance(begin(cp), end(cp));
if (len > 1) cp[1] = '@';
std::cout << cp << "\n"
<< sizeof(cp) << "\n";
}
我還要添加一些范圍檢查(這是len
部分)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.