2011-12-13 79 views
2

我無法連接兩個const char*如何連接兩個const char *?

我這樣做:

const char* p = new char[strlen(metadata.getRoot())+strlen(metadata.getPath())]; 
strcat(const_cast<char*>(p),metadata.getRoot()); 
strcat(const_cast<char*>(p),metadata.getPath()); 

strcpy(const_cast<char*>(args2->fileOrFolderPath),p); 

function(args2->fileOrFolderPath); 

現在,當我在控制檯上打印可變args2->fileOrFolderPath則出現正確的輸出...但是當我打電話與變量作爲參數的方法,並與合作變量,然後我得到了分段錯誤。問題是什麼?

+1

你打電話的價值或參考?你嘗試用p調用它嗎? – StackFlowed

+2

爲什麼你使用'const char *'呢?首先,你應該使用'std :: string'或'std :: vector ',其次你總是可以在最終需要時轉換爲'const char *'。 – zerm

+0

順便說一句,你的代碼有內存泄漏,因爲你沒有釋放'p'。無論如何,似乎毫無意義地分配'p',你也可以直接將字符串直接放到'args2-> fileOrFolderPath'指向的內存中。如果它足夠長,你不會檢查。使用'std :: string'的原因是爲了保存處理這類事情的代碼頁面。 –

回答

1

1.

const char* p=new char[strlen(metadata.getRoot())+strlen(metadata.getPath())+1]; 

長度加1來存儲 '\ 0'。

2.

strcpy(const_cast<char*>(args2->fileOrFolderPath),p); 

你不能保證args2->fileOrFolderPath的長度比strlen(p) longger。

這行之有效

#include <iostream> 
using namespace std; 
void foo(const char*s){ 
    cout<<s<<endl; 
} 
int main(int argc,char*argv[]){ 
    const char* s1 = "hello "; 
    const char* s2 = "world!"; 
    const char* p = new char [strlen(s1)+strlen(s2)+1]; 
    const char* s = new char [strlen(s1)+strlen(s2)+1]; 
    strcat(const_cast<char*>(p),s1); 
    strcat(const_cast<char*>(p),s2); 
    strcpy(const_cast<char*>(s),p); 
    cout<<s<<endl; 
    foo(s); 

    return 0; 
} 
+0

這也不工作...我猜const是問題... –

+0

@TobiWeißhaar是的,dest緩衝區不能是const,因爲你正在改變它。 – renenglish

+0

什麼是args2-> fileOrFolderPath?你有足夠的內存嗎? – renenglish

1

你有char指針,指向不能修改的char常量。你可以做的是你爲const char陣列複製到一些字符數組,做像這樣concate常量字符串:

char result[MAX]; 

strcpy(result,some_char_array); // copy to result array 
strcat(result,another_char_array); // concat to result array 
+0

爲什麼打印顯示正確的輸出? –

+0

@Tobi:strcpy開始寫入結果的第一個字符。 strcat搜索第一個出現的空字符,所以如果你想使用strcat,你必須首先初始化結果。 – stefaanv

+0

這是所有本地的答案,但它不能解決我的問題:( –

1

我相信你需要包括空結束空間,第一個參數strcat不該當您嘗試修改指向的內存時,不會是const

你想要做這樣的事:「你好,世界」

char * str1 = "Hello, "; 
char * str2 = "World!\n"; 

char * buffer = malloc(strlen(str1) + strlen(str2) + 1); 

strcpy(buffer, str1); 
strcat(buffer, str2); 

printf(buffer); 

打印出如預期。

至於你使用參數時看到的錯誤,我寫了一些測試,看看爲什麼它不會因使用const局部變量而中斷。雖然使用const char *對我使用作爲目標的指示編譯我得到這樣的警告:

./strings.c:10: warning: passing argument 1 of ‘strcat’ discards qualifiers from pointer target type 

正如它指出,常量被丟棄,它按預期工作。但是,如果我傳遞的參數是指針,則在嘗試修改它寫入的緩衝區時會出現總線錯誤。我懷疑發生了什麼是它忽略了參數上的常量,但是它不能修改緩衝區,因爲它在代碼中的其他地方被定義爲常量。

+0

不,這不是故障..遺憾:/ –

+2

不應該使用「calloc」或第一個「strcat」更改爲「strcpy」? –

+1

@Matic Yep ,你是對的 - 快速入侵它! –

2

我寧願使用的std :: string這一點,但如果你喜歡的char *和海峽...功能,至少使用strcat的前初始化號碼:

*p = 0; 

BTW: 使用std :: string,這將是:

std::string p = std::string(metadata.getRoot()) + metadata.getPath(); 
strcpy(const_cast<char*>(args2->fileOrFolderPath), p.c_str()); 

function(args2->fileOrFolderPath); 

而且您不必在某處解除分配p。

+0

這也行不通...我猜const是問題... –

+0

@Toby:有絕對的沒有理由將p聲明爲const,因爲你試圖改變它,所以刪除const,但你真的必須初始化p(通過設置它爲0或在使用strcat之前使用strcpy)。順便說一句,是否有任何理由有fileOrFolderPath常量? – stefaanv

+1

@Toby:當你說「這不起作用」,你是否也意味着std :: string解決方案? – stefaanv

3

我沒有宣佈他們喜歡這一點,但我知道他們有這個信息 所以,我有這樣的:

const char* ruta1 = "C:\\Users\\Deivid\\Desktop\\"; 
const char* ruta2 = "lenaGris.xls"; 

然後我用這個進行連結:

char * RutaFinal = new char[strlen(ruta1) + strlen(ruta2) + 1]; 
strcpy(RutaFinal, ruta1); 
strcat(RutaFinal, ruta2); 

printf(RutaFinal); 

這對我有效。