2014-10-30 185 views
0

我正在寫一個函數,它通過引用和字符數組以及數組的大小接收字符串。該字符串中已經有字符。我試圖擦除字符串中的字符並複製數組中的字符。 我試着設置一個for循環來複制,但如果字符串太小或太大,它就不起作用。我不能在這個函數中使用strcopy。需要一些指導。如何將一個字符數組複製到一個字符串C++

void functionname(string &first, char arr[], int size) { 

int i; 

    (for i = 0; i < size; i++) { 
    first[i] = arr[i]; 
    } 

} 
+2

對此不起作用的是什麼?你有錯誤嗎?他們是什麼? – 0x499602D2 2014-10-30 02:42:56

+0

FWIW,當'first'的傳入值的'.size()'小於'size'參數時,你的代碼是不可靠的。假設'first'是「abc」,'arr []'是VWXYZ並且大小是5 ...你將'VWX'複製到'abc'上 - 這是允許的 - 但是然後嘗試將'Z'複製到' 4]'這是(C++ 11的)保證拿着一個NUL但不合法寫入(對於C++ 03它可能不是一個NUL並且也是未定義的行爲來寫),然後當然編寫最終的'Z'甚至超出了任何可能的NUL,甚至在C++ 11中,索引操作是未定義的行爲,更不用說寫入了...更多... – 2014-10-30 03:13:56

回答

2

您可以使用std::string的默認賦值運算符=,只是做

first = arr; 
+0

只是一個註釋:如果'arr'持有ASCIIZ文本(即由NUL/0字符終止的文本字符,您不認爲它是文本/值的一部分),而zzz777的回答則愉快地將字符串設置爲包含數組中的第一個「size」字符*即使* some/all都是NUL 。 – 2014-10-30 03:02:19

2

的std :: string具有的功能做first.assign(ARR,大小)

1

以下作爲std :: string替代賦值運算符(=),以便char *允許從字符指針直接賦值給字符串。

#include <iostream> 
#include <string> 
#include <cstring> 

using namespace std; 

void functionname(string &first, char arr[], int size) 
{ 
    first = arr; 
} 

int main() 
{ 
    std::string x = "mystring"; 
    char buff[x.length()]; 
    strcpy(buff, "other"); 

    cout << x << endl; 
    functionname(x, buff, x.length()); 

    cout << x << endl; 

    return 0; 
} 
0

string有一個構造函數,它複製一個字符數組並獲取一個計數。無論arr數組內有什麼內容,這都可以工作,甚至可以嵌入空字符。

void functionname(string &first, char arr[], int size) { 

    first = string(arr, size); 

} 

再次,內容arr被複制到字符串,則無需在此之後保持arr左右,如果你不需要它了。

相關問題