Bagaimana cara menambahkan dua string?
Saya mencoba name = "derp" + "herp";
, tetapi saya mendapat kesalahan:
Ekspresi harus memiliki tipe integral atau enum
Bagaimana cara menambahkan dua string?
Saya mencoba name = "derp" + "herp";
, tetapi saya mendapat kesalahan:
Ekspresi harus memiliki tipe integral atau enum
Jawaban:
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 strcat
untuk 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 free
memori 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.
stpcpy
, yang mengembalikan pointer ke akhir string pertama:strcpy(stpcpy(result, s1), s2);
David Heffernan menjelaskan masalah ini dalam jawabannya, dan saya menulis kode yang diperbaiki. Lihat di bawah.
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;
}
#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
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);
int len
-> size_t len
sebagaimana size_t
jenis yang tepat untuk kode "ukuran". Juga // room for NULL
-> // room for null character
NULL
menyiratkan pointer nol.
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.
snprintf(result, sizeof result, "%s %s %s", s1, s2, s3);
Anda harus menggunakan strcat
, atau lebih baik strncat
,. Google itu (kata kunci "menyatukan").
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.
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
.
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;
}
#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);
}
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;
}
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 strcpy
atau 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".
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);
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.