2012-11-05 106 views
11

我有什麼:c char字符數組串聯

char cmd[50] = "some text here"; 
char v[] = {'a','s','d','c','b'}; 

所以我想從v添加字母來連接cmd

很明顯:

strcat(cmd, v[3]); 

不起作用,因爲strcat不接受v[n]參數n = int

回答

9

與方法的問題。

  • C字符串必須以0字節結尾,換句話說就是'\0'字符。使用""會自動添加,但除此之外,您必須自己添加它,並且所有字符串函數都依賴於那裏的0。

  • 您的v數組包含字符,而不是字符串,並且strcat需要字符串。

一個解決方案:

char cmd[50] = "some text here"; 
char *v[] = {"a","s","d","c","b"}; 
strcat(cmd,v[3]); 

這就使你的字符數組的指針到數組到C字符串。

此外,你有責任注意,cmd[]包含足夠的空間來容納任何你添加到它的strcat(在這裏它)。通常最好使用snprintf來進行字符串連接,因爲它需要目標數組的總大小爲,包括終止爲null,並且總是添加null,所以很難搞定。例如與原來的字符數組:

char cmd[50] = "some text here"; 
char buf[50]; 
char v[] = {'a','s','d','c','b'}; 
snprintf(buf, sizeof buf, "%s%c", cmd, v[3]); 

注:的sizeof這樣的工作,只有當buf確實是一個數組,[]喜歡這裏聲明。同樣,對於snprintf,使用與目標和格式參數相同的緩衝區可能會產生意外的結果,所以我添加了新的目標緩衝區變量。

一個更snprintf的例子,與你原來的兩個唯一陣列,追加到結束的CMD的當前內容:

snprintf(cmd + strlen(cmd), (sizeof cmd) - strlen(cmd), "%c", v[3]); 

所以很明顯,在這種特殊情況下,strncat(cmd, &v[3], 1)在其他的答案建議增加1個字符更好,但snprintf的好處是,您可以添加printf支持的所有數據類型,而不是字符。

+1

謝謝!如果我可以保證cmd []包含足夠的空間,那麼您認爲哪一個是最快的方法? – redgiun

+0

strncat可能是這些中最快的,但最快的是'int len = strlen(cmd); cmd [len] = v [3]; cmd [len + 1] = 0;'。注意數組索引是如何從0開始的,所以'some_cstring [strlen(some_cstring)]'總是0. – hyde

+1

謝謝。這很有用 – redgiun

1

怎麼樣

strcat(cmd,&v[3]); 
+1

這將添加多個字符,它會超出數組的末尾來複制數據,因爲沒有空終止。 – Benj

+0

你是對的,非常小心 – user1203650

2

首先,確保變量 'CMD' 有足夠的內存分配。

其次,對'v [3]'的提及是一個有符號字節的值。您必須使用以下調用strncat函數(不是strcat的):

strncat(cmd,&v[3],1); 
+2

也許你的意思是strncat – MOHAMED

12

嗯。據我所知,你想從第二個數組中添加一個字符? 所以你必須使用

strncat (cmd, &v[3], 1); 

:-)

+0

我選擇了另一種方式來做到這一點,但這也適用於廣告,非常簡單。謝謝 :) – redgiun

1

的問題是,你不strcat的,以及使用方法:

char *strcat (char *dest, const char *src); 

,因爲你做

char *strcat (char *dest, char src); 

所以你必須聲明一個char *作爲char。

5

使用這樣的:

strcat(cmd,&v[3]); 

&v[3]不是一個指向空結尾的字符串!改用

strncat(cmd, &v[3], 1); 
1
char buf[2]; 

sprintf(buf,"%c", V[3]); 
strcat(cmd, buf); 

strncat (cmd, &v[3],1); 

你不能

strcat(cmd,&v[3]); 

這個做它將從電池3 V陣列coppy到數組的末尾,而不是複製只有V [3]

我可以建議另一個解決方案

int len = strlen(cmd); 
cmd[len]=v[3]; 
cmd[len+1] = '\0';