2016-05-07 4 views
-2

Есть ли функция, которая позволяет мне конкатенировать строку в начале другой строки?строка concat для начала другой строки

Например, если у меня есть

str1 = "world!"; 
str2 = "Hello, "; 

Есть ли какой-нибудь способ, чтобы объединить эти строки в одну строку, которая содержит «Привет, мир!»?

+1

ли вы взглянули на 'strcat'? – SMA

ответ

1

Это можно сделать разными способами. Вот один подход который использует динамическое распределение памяти:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char* str1 = "world!"; 
    char* str2 = "Hello, "; 
    char* p = malloc(strlen(str1) + strlen(str2) + 1); // Allocate memory for the new string 
    strcpy(p, str2); // Copy str2 to the new string 
    strcat(p, str1); // Concatenate str1 
    printf("%s", p); // print it 
    free(p);   // free the allocated memory 
    return 0; 
} 

Попробуйте код здесь: http://ideone.com/oydJHN

Вместо динамического выделения памяти вы можете использовать что-то вроде:

#define LENGTH_OF_RESULT 100 

char result[LENGTH_OF_RESULT]; 

вместо char* p;. Вы должны убедиться, что LENGTH_OF_RESULT достаточно велик, чтобы удерживать конкатенированную строку.

Преимущество распределения динамической памяти заключается в том, что вам не нужно беспокоиться о размере целевой строки - просто выделите то, что вам нужно, на основе длины входных строк и добавьте 1 для нулевого завершения.

Недостатком использования динамического распределения памяти является то, что вы должны помнить free память при выполнении с ней.

+2

Вы забыли 'stdlib.h' –

+2

И' string.h'. –

2

Вы можете сделать это, используя статически заявленную память, а не динамически выделять память, а также избежать дополнительного вызова malloc и позвонить по телефону free. В любом случае это хорошо. Простой пример:

#include <stdio.h> 
#include <string.h> 

enum { MAXL = 64 }; /* constant for max concatenated length */ 

int main (void) { 

    char str1[MAXL] = "hello"; 
    char str2[MAXL] = "world"; 
    char dest[2*MAXL+1] = ""; 

    strcpy (dest, str1); 
    strcat (dest, " "); 
    strcat (dest, str2); 
    strcat (dest, "!"); 

    printf ("\n%s\n\n", dest); 

    return 0; 
} 

Пример использование

$ ./bin/concat 

hello world! 

Ключ в любом случае просто страхование у вас есть достаточное пространство в вашей destination строке для хранения сцепленных результатов. Объединение 2-строк с максимальным количеством символов означает только 1 разделитель, вы можете дважды использовать хранилище для существующих строк (вы возвращаете один символ, только используя 1 nul-terminating символ в комбинированной строке вместо 2 до). Если вы добавляете дополнительные символы в качестве разделителей, вы просто должны добавить их в общее хранилище. Дайте мне знать, если у вас есть вопросы.

+0

Почему бы не '#define MAXL 64'? –

+0

Это хорошо работает. Но я вытащил из файла, который имел 'enum {MAXC = 32, MAXL = 64};' поэтому я просто удалил один и сохранил другой (laziness ':)' –

1

Вы можете сделать свой собственный function.It довольно легко:

#include <stdio.h> 
#include <string.h> 

void my_strcat(char *dst, const char *src); 


int main(void) 
{ 
    char dst[50] = "world"; 
    char src[] = "hello "; 
    my_strcat(dst, src); 
    printf("%s\n", dst); 
    return 0; 
} 

void my_strcat(char *dst, const char *src) 
{ 
    size_t dst_len = strlen(dst) + 1, src_len = strlen(src); 
    memmove(dst + src_len, dst, dst_len); 
    memcpy(dst, src, src_len); 
} 
+0

Ваш код не будет NUL-terminate, не так ли? Итак, UB ... –

+0

он делает сейчас. Я считал NUL-завершающим, но декларация вроде 'char dst [50] =" string "' оставит в избытке 0's –

+0

А, да. Я пропустил это. –