2011-03-18 96 views
2

如何連接字符串與C/C++?C/C++中的連接字符串

我嘗試以下方法:

PS:errorInfo中是一個char *我應該回到它。

 errorInfo = strcat("Workflow: ", strcat(
      workflowToString(workflow).utf8(), strcat(" ERROR: ", 
        errorCode.utf8))); 

     sprintf(errorInfo, "Workflow %s ERROR: %s", 
      workflowToString(workflow).utf8(), errorCode.utf8()); 

     errorInfo = "Workflow: " + workflowToString(workflow).utf8() + " ERROR: " + errorCode.utf8; 

只是sprintf編譯,但運行我的應用程序崩潰。

PS:我使用NDK於Android

+0

所有的點使它看起來像你使用'C++'(沒有'C/C++')。我認爲使用'std :: string'是你最好的選擇:不要使用'char *'! – pmg 2011-03-18 15:30:32

+0

你是什麼意思,「errorInfo是一個char *我應該返回它」? 'char *'是一個指針,可以或不可以被初始化,如果指向某個可能是或者不可能是字符串的內存,可能有或沒有足夠的空間存儲你正在創建的字符串,並且有一個生命週期可能會或可能不符合您的呼叫者的期望。如果你對C或C++中的內存分配一無所知,那麼你很急於閱讀一本關於其中一個或兩個的書。至少有5或6種編寫C++函數的方法將所有這些東西結合在一起並返回,並且你和調用者需要同意。 – 2011-03-18 15:46:19

+0

http://www.crasseux.com/books/ctutorial/Memory-allocation.html給出了關於C內存分配的教程。如果你以前從來沒有涉足過C,不用擔心。內存的東西可能會很棘手。只要繼續練習:) – Davidann 2011-03-18 15:50:37

回答

3

根據this pagestrcat執行以下操作:

將源字符串的副本追加到目標字符串。目標中的終止空字符被源的第一個字符覆蓋,並且在由目標中的兩個串聯形成的新字符串的末尾附加新的空字符。

但在您的實施中,"Workflow: "是一個常量字符串。您無法修改該字符串,這是strcat會執行的操作。爲了做到這一點,創建一個類似的字符串:

char message[1000]; 
strcpy(message, "Workflow: "); 
strcat(message, "other string"); 
.... 

但是,要小心的UTF8字符編碼,因爲一個UTF8編碼點可能有多個char悠久。

+0

好吧,我如何獲得char []作爲char *? – 2011-03-18 15:37:30

+0

@阿門:採取的一點。謝謝。 @Marcos:根據Armen分享的內容,將char []作爲char *進行投射。 – Davidann 2011-03-18 15:45:39

+0

完美,這對我很有用。我沒有鑄造它,只是「errorInfo = message」 – 2011-03-18 15:56:21

16

這樣的語言爲C/C++。有C,有C++。

  • 在C++中通過使用operator+
  • 在C串連std::string的,您使用的strcat

我知道這並不完全回答你的問題,這只是一個譁然:)

+0

謝謝我談論C/C++導致任何解決方案應該爲我工作。 – 2011-03-18 15:34:46

+8

你不能談論C/C++,因爲沒有C/C++這樣的東西。 – Philipp 2011-03-18 15:51:11

+0

只要把油潑在火上,但是因爲這個傢伙正在要求一個語法建議,並且他可以通過對他最初的字符數組的小操縱來獲得相同的結果,所以我認爲你們有點苛刻。另外,考慮到C++是C的一個超集,你認爲有人問:「如何計算矩形/方形的面積」是錯誤的。我很確定W * H是這樣做的,就像strcat可以在C++上下文中使用來連接字符串。 – 2011-03-18 20:09:23

1

通過使用strcat(),您正在使用c而不是C++。 c不會爲您自動管理內存。因爲有時它看起來好像有一個字符串數據類型,所有它正在做的是提供給字符數組的字符串接口。 首先,strcat()的第一個參數必須是可寫的,並且有足夠的空間添加第二個字符串。

char *out = strcat("This", "nThat"); 

要求c壓碎字符串文字內存。

一般來說,你應該永遠不要使用strcat()/sprintf,就像上面的「選擇」答案一樣。你可以用這種方式覆蓋內存。改用strncat()/snprintf()來避免緩衝區溢出。如果你不知道在strncat()中傳遞給「n」的大小,你很可能做錯了。在C這樣做

一種方法是:

#define ERROR_BUF_SIZE 2048 // or something big enough, you have to know in c 




char errorInfo[ERROR_BUF_SIZE]; 

    snprintf(errorInfo, ERROR_BUF_SIZE, "Workflow %s ERROR: %s", 
      workflowToString(workflow).utf8(), errorCode.utf8()); 

或類似的使用strncpy/strncat

2

級聯幾乎總是串樓錯成語,尤其是在C.它的錯誤傾向,雜波你的代碼,並具有非常糟糕的漸近性能(即O(n^2)而不是O(n)用於構建長度爲n的字符串)。

相反,你應該使用snprintf功能,如:

snprintf(buf, sizeof buf, "Workflow: %s ERROR: %s", workflow, error); 

,或者如果你正在寫一個文件/插座/等。並且不需要將結果字符串保存在內存中,只需使用fprintf即可。

1

用字符串文字,你可以簡單的使用:

char str[] = "foo" " bar"; 
const char *s = " 1 " " 2 "; 
s = " 3 " " 4 "; 
1

有很多方法,你可以同時使用的Android NDK使用C串聯:我用

的兩種方法:

  • 的strcat
  • sprintf

這裏是例子:

進入這裏

strcat的

char* buffer1=(char*)malloc(250000); 
char* buffer2=(char*)malloc(250000); 
char* buffer3=(char*)malloc(250000); 

buffer1 = strcat(buffer1, buffer2); 

的sprintf

sprintf(buffer3,"this is buffer1: %s and this is buffer2:%s",buffer1,buffer2);` 

的sprintf返回長度的字符串代碼

strcat的不推薦,因爲它的使用更多的記憶.. 你可以使用sprintf或其他像strcpy。

希望它有幫助。