2012-06-13 148 views
2

我有一個函數C++複製爲const char *爲char *

ClassA::FuncA(const char *filePath) 

,並希望這一爲const char *字符串複製到一個char *!

我的解決辦法:

char *argv[2]; 
int length = strlen(filePath); 
argv[1] = new char(length +1); 
strncpy(argv[1], filePath, length); 

在這之後我argv中[1]所需的字符,而且其他一些不確定的字符!

文件路徑:

「C:\用戶\用戶A \Parameter.xmlþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþKŸQyá•」

請告訴我錯在這裏?用strlen的長度是可以的!

回答

14

像這樣:

argv[1] = new char[length +1](); //() to value-initialize the array 

您的版本:

argv[1] = new char(length +1); 

只分配一個char和它的價值初始化爲length+1

+0

'argv [1] = new char [length + 1]; strncpy(argv [1],filePath,length + 1);'可能會更快更大的長度?!好吧,在大多數情況下,我猜想沒關係。 – smerlin

+0

@smerlin什麼? –

+0

我按了一個換行符輸入...以及在註釋中不起作用,所以我的不完整的評論第二次可見。你要快! – smerlin

0

strncpy()副本不超過length個字符。這樣做,終止\0未被複制。

1

你在你的代碼的兩個問題:

  • 你需要以複製空字符複製後加1到長度(如strlen的回報只有數個字符的無空字符;看到更多here) 。因此,將代碼更改爲:

    strncpy(argv [1],filePath,length + 1);

  • 你需要修復你的數組是如何初始化的,因爲你只初始化一個字符(並且我們假設你想要完整的字符串被複制)。所以:

    argv [1] = new char [length + 1]();


注:

  • 請當你帖子還張貼了用來打印出數據,此類問題在很多情況下的代碼依賴於你打電話打印出什麼數據。
  • 最後,你可能會考慮只使用一個初始化爲最大路徑的固定大小的數組。在Windows結賬最大路徑大小以下post
1

的問題是,你使用strncpy,而不是strcpy。並且你使用它的方式,它不會複製終止的\0

實際上,因爲strncpy可能會留下一個沒有\0終止符的字符串,所以最好避免它。在你的情況下,單獨的strcpy是好的,因爲你剛剛分配了一個足夠大的緩衝區。在更一般的情況下,您可能必須使用strlen,以確保您具有的字符串適合目標緩衝區(從未忘記將結果添加到1,對於\0)。

如果發生了很多的情況下,您可能要編寫自己的版本strncpy ,其中工程(即保證了終止\0,並且 不會複製或超過必要寫個字符)。喜歡的東西:

void 
stringCopy(char* dest, int maxLength, char const* source) 
{ 
    assert(maxLength > 0); 
    char* end = dest + maxLength - 1; 
    while (dest != end && *source != '\0') { 
     *dest = *source; 
     ++ dest; 
     ++ source; 
    } 
    *dest = '\0'; 
} 

(該功能確實存在,這個名字strcpy_s下用C 2011,但 它沒有廣泛實施;微軟有它,但我從來沒見過它 其他地方)