Bagaimana cara menggabungkan dua string dalam C?

141

Bagaimana cara menambahkan dua string?

Saya mencoba name = "derp" + "herp";, tetapi saya mendapat kesalahan:

Ekspresi harus memiliki tipe integral atau enum

Retribusi H
sumber

Jawaban:

184

C tidak memiliki dukungan untuk string yang dimiliki beberapa bahasa lain. Sebuah string dalam C hanyalah sebuah pointer ke arraychar yang diakhiri oleh karakter nol pertama. Tidak ada operator penggabungan string di C.

Gunakan strcatuntuk menggabungkan dua string. Anda dapat menggunakan fungsi berikut untuk melakukannya:

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

char* concat(const char *s1, const char *s2)
{
    char *result = malloc(strlen(s1) + strlen(s2) + 1); // +1 for the null-terminator
    // in real code you would check for errors in malloc here
    strcpy(result, s1);
    strcat(result, s2);
    return result;
}

Ini bukan cara tercepat untuk melakukan ini, tetapi Anda tidak perlu khawatir tentang itu sekarang. Perhatikan bahwa fungsi mengembalikan blok memori yang dialokasikan tumpukan ke pemanggil dan meneruskan kepemilikan memori itu. Ini adalah tanggung jawab penelepon ke freememori ketika tidak lagi diperlukan.

Panggil fungsi seperti ini:

char* s = concat("derp", "herp");
// do things with s
free(s); // deallocate the string

Jika Anda memang terganggu oleh kinerja maka Anda ingin menghindari pemindaian berulang kali input buffer mencari null-terminator.

char* concat(const char *s1, const char *s2)
{
    const size_t len1 = strlen(s1);
    const size_t len2 = strlen(s2);
    char *result = malloc(len1 + len2 + 1); // +1 for the null-terminator
    // in real code you would check for errors in malloc here
    memcpy(result, s1, len1);
    memcpy(result + len1, s2, len2 + 1); // +1 to copy the null-terminator
    return result;
}

Jika Anda berencana untuk melakukan banyak pekerjaan dengan string maka Anda mungkin lebih baik menggunakan bahasa yang berbeda yang memiliki dukungan kelas pertama untuk string.

David Heffernan
sumber
1
Bit kecil: kode dapat menyalin bagian pertama dari string lalu dan kemudian return memcpy(result, s1, len1);. Meskipun optimasi mikro atau setidaknya sedikit kode golf, peningkatan potensial seperti itu pada operasi string dasar dapat memiliki nilai mengingat penggunaannya yang tinggi.
chux - Reinstate Monica
2
Peningkatan kinerja kecil menggunakan versi pertama stpcpy, yang mengembalikan pointer ke akhir string pertama:strcpy(stpcpy(result, s1), s2);
Daniel
17
#include <stdio.h>

int main(){
    char name[] =  "derp" "herp";
    printf("\"%s\"\n", name);//"derpherp"
    return 0;
}
BLUEPIXY
sumber
1
Ini juga berfungsi untuk makro di c, yang patut dicatat
Abe Fehr
15

David Heffernan menjelaskan masalah ini dalam jawabannya, dan saya menulis kode yang diperbaiki. Lihat di bawah.

Fungsi generik

Kita dapat menulis fungsi variadic yang berguna untuk menggabungkan sejumlah string:

#include <stdlib.h>       // calloc
#include <stdarg.h>       // va_*
#include <string.h>       // strlen, strcpy

char* concat(int count, ...)
{
    va_list ap;
    int i;

    // Find required length to store merged string
    int len = 1; // room for NULL
    va_start(ap, count);
    for(i=0 ; i<count ; i++)
        len += strlen(va_arg(ap, char*));
    va_end(ap);

    // Allocate memory to concat strings
    char *merged = calloc(sizeof(char),len);
    int null_pos = 0;

    // Actually concatenate strings
    va_start(ap, count);
    for(i=0 ; i<count ; i++)
    {
        char *s = va_arg(ap, char*);
        strcpy(merged+null_pos, s);
        null_pos += strlen(s);
    }
    va_end(ap);

    return merged;
}

Pemakaian

#include <stdio.h>        // printf

void println(char *line)
{
    printf("%s\n", line);
}

int main(int argc, char* argv[])
{
    char *str;

    str = concat(0);             println(str); free(str);
    str = concat(1,"a");         println(str); free(str);
    str = concat(2,"a","b");     println(str); free(str);
    str = concat(3,"a","b","c"); println(str); free(str);

    return 0;
}

Keluaran:

  // Empty line
a
ab
abc

Membersihkan

Perhatikan bahwa Anda harus mengosongkan memori yang dialokasikan ketika menjadi tidak dibutuhkan untuk menghindari kebocoran memori:

char *str = concat(2,"a","b");
println(str);
free(str);
mmdemirbas
sumber
3
Argumen untuk calloc mundur. Mereka harus dihitung kemudian ukuran. Anda lolos begitu saja di sini berkat identitas multiplikatif, karena sizeof (char) didefinisikan sebagai 1.
Andy
Pertimbangkan int len-> size_t lensebagaimana size_tjenis yang tepat untuk kode "ukuran". Juga // room for NULL-> // room for null character NULLmenyiratkan pointer nol.
chux - Reinstate Monica
9

Saya akan menganggap Anda membutuhkannya untuk hal-hal satu kali. Saya akan menganggap Anda seorang pengembang PC.

Gunakan Stack, Luke. Gunakan di mana-mana. Jangan gunakan malloc / gratis untuk alokasi kecil, pernah .

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

#define STR_SIZE 10000

int main()
{
  char s1[] = "oppa";
  char s2[] = "gangnam";
  char s3[] = "style";

  {
    char result[STR_SIZE] = {0};
    snprintf(result, sizeof(result), "%s %s %s", s1, s2, s3);
    printf("%s\n", result);
  }
}

Jika 10 KB per string tidak akan cukup, tambahkan nol ke ukuran dan jangan repot-repot, - mereka akan melepaskan memori stack mereka di akhir cakupan.


sumber
1
Ini akan lebih jelas dinyatakan sebagaisnprintf(result, sizeof result, "%s %s %s", s1, s2, s3);
MM
8

Anda harus menggunakan strcat, atau lebih baik strncat,. Google itu (kata kunci "menyatukan").

orlp
sumber
8
Waspadalah: strncat()adalah fungsi yang sangat sulit untuk digunakan dengan benar. Dengan cepat, tanpa melihat manual, berapa lama Anda tentukan strncat()? Jika Anda mengatakan "panjang buffer", Anda baru saja menunjukkan maksud saya dengan baik. Ini memiliki antarmuka kontra-intuitif dan ketika Anda memiliki cukup data untuk menggunakannya dengan aman, Anda tidak perlu menggunakan fungsi di tempat pertama - ada alternatif lain, lebih cepat dan lebih efisien (seperti strcpy()atau memmove()) yang dapat digunakan sebagai gantinya. Cukup banyak pertanyaan 'apa yang harus saya gunakan', strncat()bukan jawabannya.
Jonathan Leffler
5

Anda tidak dapat menambahkan string literal seperti itu di C. Anda harus membuat buffer dengan ukuran string literal satu + string literal dua + byte untuk karakter terminasi nol dan menyalin literal yang sesuai ke buffer itu dan juga memastikan bahwa string itu diakhiri null . Atau Anda dapat menggunakan fungsi perpustakaan seperti strcat.

Mahesh
sumber
3

Tanpa ekstensi GNU:

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

int main(void) {
    const char str1[] = "First";
    const char str2[] = "Second";
    char *res;

    res = malloc(strlen(str1) + strlen(str2) + 1);
    if (!res) {
        fprintf(stderr, "malloc() failed: insufficient memory!\n");
        return EXIT_FAILURE;
    }

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

    printf("Result: '%s'\n", res);
    free(res);
    return EXIT_SUCCESS;
}

Atau dengan ekstensi GNU:

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

int main(void) {
    const char str1[] = "First";
    const char str2[] = "Second";
    char *res;

    if (-1 == asprintf(&res, "%s%s", str1, str2)) {
        fprintf(stderr, "asprintf() failed: insufficient memory!\n");
        return EXIT_FAILURE;
    }

    printf("Result: '%s'\n", res);
    free(res);
    return EXIT_SUCCESS;
}

Lihat malloc , gratis dan asprintf untuk lebih jelasnya.

Peter Mortensen
sumber
2
#include <string.h>
#include <stdio.h>
int main()
{
   int a,l;
   char str[50],str1[50],str3[100];
   printf("\nEnter a string: ");
   scanf("%s",str);
   str3[0]='\0';
   printf("\nEnter the string which you want to concat with string one: ");
   scanf("%s",str1);
   strcat(str3,str);
   strcat(str3,str1);
   printf("\nThe string is %s\n",str3);
}
pengguna2870383
sumber
2

String Pengikat

Menggabungkan dua string dalam C dapat dilakukan dengan minimal 3 cara: -

1) Dengan menyalin string 2 ke akhir string 1

#include <stdio.h>
#include <string.h>
#define MAX 100
int main()
{
  char str1[MAX],str2[MAX];
  int i,j=0;
  printf("Input string 1: ");
  gets(str1);
  printf("\nInput string 2: ");
  gets(str2);
  for(i=strlen(str1);str2[j]!='\0';i++)  //Copying string 2 to the end of string 1
  {
     str1[i]=str2[j];
     j++;
  }
  str1[i]='\0';
  printf("\nConcatenated string: ");
  puts(str1);
  return 0;
}

2) Dengan menyalin string 1 dan string 2 ke string 3

#include <stdio.h>
#include <string.h>
#define MAX 100
int main()
{
  char str1[MAX],str2[MAX],str3[MAX];
  int i,j=0,count=0;
  printf("Input string 1: ");
  gets(str1);
  printf("\nInput string 2: ");
  gets(str2);
  for(i=0;str1[i]!='\0';i++)          //Copying string 1 to string 3
  {
    str3[i]=str1[i];
    count++;
  }
  for(i=count;str2[j]!='\0';i++)     //Copying string 2 to the end of string 3
  {
    str3[i]=str2[j];
    j++;
  }
  str3[i]='\0';
  printf("\nConcatenated string : ");
  puts(str3);
  return 0;
}

3) Dengan menggunakan fungsi strcat ()

#include <stdio.h>
#include <string.h>
#define MAX 100
int main()
{
  char str1[MAX],str2[MAX];
  printf("Input string 1: ");
  gets(str1);
  printf("\nInput string 2: ");
  gets(str2);
  strcat(str1,str2);                    //strcat() function
  printf("\nConcatenated string : ");
  puts(str1);
  return 0;
}
Paurav Shah
sumber
0

Di C, Anda tidak benar-benar memiliki string, sebagai objek kelas satu yang umum. Anda harus mengelolanya sebagai array karakter, yang berarti Anda harus menentukan bagaimana Anda ingin mengatur array Anda. Salah satu caranya adalah dengan variabel normal, misal diletakkan di atas tumpukan. Cara lain adalah dengan mengalokasikannya secara dinamis malloc.

Setelah Anda mengurutkannya, Anda dapat menyalin konten dari satu array ke array lain, untuk menggabungkan dua string menggunakan strcpyatau strcat.

Karena itu, C memang memiliki konsep "string literal", yang merupakan string yang dikenal pada waktu kompilasi. Saat digunakan, mereka akan menjadi array karakter yang ditempatkan di memori read-only. Namun, dimungkinkan untuk menggabungkan dua string literal dengan menulisnya di samping satu sama lain, seperti pada "foo" "bar", yang akan membuat string literal "foobar".

Lindydancer
sumber
0

menggunakan memcpy

char *str1="hello";
char *str2=" world";
char *str3;

str3=(char *) malloc (11 *sizeof(char));
memcpy(str3,str1,5);
memcpy(str3+strlen(str1),str2,6);

printf("%s + %s = %s",str1,str2,str3);
free(str3);
Khalegh Salehi
sumber