簡體   English   中英

如何在沒有任何臨時char數組作為變量的情況下將字符數組傳遞給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] = '@'會拋出段錯誤。

我的問題是

  1. 如何避免使用Main 1使用的temp變量,而是直接將一個字符數組作為參數傳遞給func

  2. 重要條件是允許編輯傳遞到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM