10 ответов:
C не поддерживает строки, которые есть в некоторых других языках. Строка в C-это просто указатель на массив
charэто завершается первым нулевым символом. Нет оператора конкатенации строк в C.использовать
strcatдля объединения двух строк. Для этого можно использовать следующую функцию:#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; }это не самый быстрый способ сделать это, но вы не должны беспокоиться об этом сейчас. Обратите внимание, что функция возвращает блок кучи выделенная память для вызывающего абонента и передает право собственности на эту память. Это ответственность вызывающего абонента
freeпамять, когда она больше не нужна.вызовите функцию следующим образом:
char* s = concat("derp", "herp"); // do things with s free(s); // deallocate the stringесли вас беспокоит производительность, то вы хотели бы избежать повторного сканирования входных буферов, ищущих нулевой Терминатор.
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; }если вы планируете много работать со строками, то вам может быть лучше использовать другой язык, который имеет поддержку первого класса для строк.
#include <stdio.h> int main(){ char name[] = "derp" "herp"; printf("\"%s\"\n", name);//"derpherp" return 0; }
Дэвид Хеффернан объяснил вопрос в его ответе, и я написал улучшенный код. Увидеть ниже.
общая функция
мы можем написать полезное вариативную функцию для объединения любого количества строк:
#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; }выход:
// Empty line a ab abcочистка
обратите внимание, что вы должны освободить выделенную память, когда она становится ненужной, чтобы избежать памяти утечки:
char *str = concat(2,"a","b"); println(str); free(str);
вы не можете добавить строковые литералы, как это в C. Вы должны создать буфер размером строковый литерал один + строковый литерал два + байт для нулевого символа окончания и скопировать соответствующие литералы в этот буфер, а также убедитесь, что это значение null. Или вы можете использовать библиотечные функции, такие как
strcat.
Я предполагаю, что вам это нужно для одноразовых вещей. Я предполагаю, что вы разработчик ПК.
используй стек, Люк. Используйте его везде. Не используйте malloc / free для небольших ассигнований,когда-нибудь.
#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); } }Если 10 КБ на строку будет недостаточно, добавьте ноль к размеру и не беспокойтесь, - они все равно выпустят свою память стека в конце областей.
без расширения 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; }альтернативно с расширением 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; }посмотреть Танос,свободный и asprintf для более подробной информации.
#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]=''; 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); }
Конкатенации Строк
объединение любых двух строк в C может быть сделано по крайней мере 3 способами :-
1) путем копирования строки 2 в конец строки 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]!='';i++) //Copying string 2 to the end of string 1 { str1[i]=str2[j]; j++; } str1[i]=''; printf("\nConcatenated string: "); puts(str1); return 0; }2) путем копирования строки 1 и строки 2 в строку 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]!='';i++) //Copying string 1 to string 3 { str3[i]=str1[i]; count++; } for(i=count;str2[j]!='';i++) //Copying string 2 to the end of string 3 { str3[i]=str2[j]; j++; } str3[i]=''; printf("\nConcatenated string : "); puts(str3); return 0; }3) с помощью функции 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; }
В C у вас действительно нет строк, как общий объект первого класса. Вы должны управлять ими как массивами символов, что означает, что вы должны определить, как вы хотели бы управлять своими массивами. Один из способов-это нормальные переменные, например, помещенные в стек. Другой способ - выделить их динамически с помощью
malloc.после того, как вы это отсортировали, вы можете скопировать содержимое одного массива в другой, чтобы объединить две строки с помощью
strcpyилиstrcat.сказав это, C имеет понятие "строковые литералы", которые являются строками, известными во время компиляции. При использовании они будут представлять собой массив символов, помещенный в память только для чтения. Однако можно объединить два строковых литерала, написав их рядом друг с другом, как в
"foo" "bar", который создаст строковый литерал "foobar".
Comments