2012-10-08 144 views
1

如何組合多個字符串。 例如,在C中追加字符串

char item[32]; 
scanf("%s", item); 
printf("Shopping list: %s\n", item); //I want to combine this string 
char string_2[] = "To do list: Sleep\n"; // with this string 
char hw[32]; 
scanf("%s", hw); 
printf("Homework: %s\n", hw); // and this string 

因此,他們將印像下面,

購物清單:(項目)

待辦事項:睡眠

作業:(HW)


但我不想給printf命令分別像cod上述E,而是/結合串並調用printf末


我如何能做到這一點,因爲我無法保存這樣的事情到一個單獨的字符串,char string1 = ("Shopping list: %s \n", item)

+0

[C string append]可能的重複(http://stackoverflow.com/questions/5901181/c-string-append) – technosaurus

回答

1

您可以使用sprintf

char combinedstring[100]; 
sprintf(combinedstring,"%s %s %s",item,string_2,hw); 

您還可以查看string.h標題及其功能。

+2

儘管原則上正確,但應該使用snprintf()函數來避免緩衝區溢出。用sprintf(),你永遠不會知道結果字符串有多大。 –

2

連接的字符串,最好用strcat函數。

但請確保連接到的目標字符串足夠大以適合所有內容(包括終止的'\0'字符)。

+1

'strcat'幾乎從不「優先」...... –

2

使用strcpystrcat

char item[] = "Shopping list"; 
char hw[] = "To do list: Sleep \n"; 
char* itemhw; 
itemhw = malloc(strlen(item)+strlen(hw)+1); 
strcpy(itemhw, item); 
strcat(itemhw, hw); 
free(itemhw); 
+1

此代碼在其中有一個緩衝區溢出錯誤。 –

+0

提示:這是一個「一次性」錯誤:) –

+0

@Parag:的確如此。 +1失蹤。 –

1

用C處理原始字符串總是難看。您必須執行兩個步驟來連​​接字符串:

  1. 爲新字符串分配內存。

  2. 將源字符串複製到您的新緩衝區中。

爲鑑,請注意,已經有三個不同的答案,這個問題與三個不同的緩衝區溢出錯誤。

這裏是連接兩個字符串,返回一個新字符串的函數:

char *astrcat(const char *x, const char *y) 
{ 
    size_t nx = strlen(x), ny = strlen(y); 
    char *z = malloc(nx + ny + 1); 
    if (!z) 
     return NULL; 
    memcpy(z, x, nx); 
    memcpy(z + nx, y, ny + 1); 
    return z; 
} 

可以擴大這三個字符串的工作,或者你可以把它叫做兩次。民俗往往傾向於使用圖書館或廣泛使用固定大小的緩衝區。

備選:用固定大小的緩衝區和snprintf,你會得到安全和易用性,但你堅持固定大小的緩衝區。

const char *x = ..., *y = ...; 
char buf[100]; 
snprintf(buf, sizeof(buf), "%s%s", x, y); 

如果沒有snprintf做,那麼你很可能使用MSVC,其中有_snprintf這幾乎是相同的,但並不總是NUL,終止輸出。

不要使用strcatstrcpy有極少數的情況下,其中strcat是可以接受的:

char buf[100]; 
strcpy(buf, x); // buffer overflow 
strcat(buf, y); // buffer overflow 

不要使用sprintf它還溢出:

char buf[100]; 
sprintf(buf, "%s%s", x, y); // buffer overflow 
1

我將忽略多個問題(輸入和輸出的排序;輸入的錯誤處理;緩衝區溢出o n輸入;單個單詞VS中的條目等)多的話,但是:

char item[32]; 
scanf("%s", item); 
char hw[32]; 
scanf("%s", hw); 
char string_2[] = "To do list: Sleep\n"; 

printf("Shopping list: %s\n%sHomework: %s\n", item, string_2, hw); 

這給你一個printf()聲明,提供級聯輸出。顯然,級聯在輸出文件(標準輸出)上,而不是直接在內存中。如果你想在內存連接在一起的字符串,那麼你必須要經過一些陰謀詭計,以確保有足夠的內存複製到,但你可以使用snprintf()作業,而不是printf()

char item[32]; 
scanf("%s", item); 
char hw[32]; 
scanf("%s", hw); 
char string_2[] = "To do list: Sleep\n"; 

// This length does account for two extra newlines and a trailing null 
size_t totlen = strlen(item) + strlen(homework) + sizeof(string_2) + 
       sizeof("Shopping list: ") + sizeof("Homework: "); 
char *conc_string = malloc(totlen); 

snprintf(conc_string, totlen, "Shopping list: %s\n%sHomework: %s\n", 
     item, string_2, hw); 
0

考慮使用大但未知的open_memstream()函數。用法

FILE *open_memstream(char **ptr, size_t *sizeloc);

例子:

// open the stream 
FILE *stream; 
char *buf; 
size_t len; 
stream = open_memstream(&buf, &len); 

// write what you want with fprintf() 
char item[32]; 
scanf("%s", item); 
fprintf(stream, "Shopping list: %s\n", item); 
char string_2[] = "To do list: Sleep\n"; 
fprintf(stream, "%s\n", string_2); 
char hw[32]; 
scanf("%s", hw); 
fprintf(stream, "Homework: %s\n", hw); 

// close the stream, the buffer is allocated and the size is set ! 
fclose(stream); 
printf ("the result is '%s' (%d characters)\n", buf, len); 
free(buf); 

讓內核管理緩衝區分配,它比你更好!