Как объединить две строки в C?

Как добавить две строки?

Я попробовал name = "derp" + "herp"; , но я получил сообщение об ошибке:

Выражение должно иметь интегральный или перечисляемый тип

C не поддерживает строки, которые имеют некоторые другие языки. Строка в C – это просто указатель на массив char который заканчивается первым нулевым символом. В C. нет оператора конкатенации строк.

Используйте strcat для объединения двух строк. Для этого вы можете использовать следующую функцию:

 #include  #include  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  int main(){ char name[] = "derp" "herp"; printf("\"%s\"\n", name);//"derpherp" return 0; } 

Дэвид Хеффернан объяснил этот вопрос в своем ответе, и я написал улучшенный код. Смотри ниже.

Общая функция

Мы можем написать полезную переменную функцию для конкатенации любого числа строк:

 #include  // calloc #include  // va_* #include  // 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 

Применение

 #include  // 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); 

Вы должны использовать strcat , или лучше, strncat . Google это (ключевое слово «конкатенация»).

Вы не можете добавлять строковые литералы, подобные тому, который задан в C. Вы должны создать буфер размера строкового литерала 1 + строковый литерал 2 + байта для символа нулевого завершения и скопировать соответствующие литералы в этот буфер, а также убедиться, что он имеет нулевое завершение , Или вы можете использовать библиотечные функции, такие как strcat .

Я предполагаю, что вам нужно это для разовых вещей. Предполагаю, что вы разработчик ПК.

Используйте Стек, Люк. Используйте его везде. Не используйте malloc / free для небольших распределений, когда-либо .

 #include  #include  #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  #include  #include  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  #include  #include  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; } 

Подробнее см. Malloc , free и asprintf .

 #include  #include  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); } 

Конкатенатные строки

Объединение любых двух строк в C может осуществляться по крайней мере тремя способами: –

1) Скопировав строку 2 в конец строки 1

 #include  #include  #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) Скопировав строку 1 и строку 2 в строку 3

 #include  #include  #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) Используя функцию strcat ()

 #include  #include  #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 у вас на самом деле нет строк, как общего первоclassного объекта. Вы должны управлять ими как массивы символов, а это значит, что вам нужно определить, как вы хотите управлять своими массивами. Один из способов – это обычные переменные, например, помещенные в стек. Другой способ – распределить их динамически с помощью malloc .

После сортировки вы можете скопировать содержимое одного массива в другой, чтобы объединить две строки, используя strcpy или strcat .

Сказав это, у C есть понятие «строковые литералы», которые известны во время компиляции. При использовании они будут символьным массивом, помещенным в постоянную память. Тем не менее, можно объединить два строковых литерала, написав их рядом друг с другом, как в "foo" "bar" , который создаст строковый литерал «foobar».

  • Как удалить подстроку из данной строки?
  • Как предотвратить java.lang.String.split () от создания ведущей пустой строки?
  • Как разбить число на отдельные цифры в c #?
  • Удалить текст между разделителями в строке (с использованием регулярного выражения?)
  • Команды командной строки запуска
  • Как конкатенировать строку и int в C?
  • Как форматировать строки, используя printf (), чтобы получить равную длину в выходе?
  • Проверка того, что строка содержит только буквы в C #
  • string.Join в списке или другом типе
  • Когда Java-строки интернированы?
  • Найти и извлечь номер из строки
  • Interesting Posts

    Как избежать потери текущих веб-сайтов браузеров при перенаправлении с помощью беспроводных страниц входа в систему

    Могу ли я зависеть от значений GetHashCode (), чтобы они были согласованными?

    Запустить приложение Metro при запуске?

    Как завершить stream в C #?

    Как отслеживать выделения памяти в C ++ (особенно new / delete)

    Неожиданное невоимое возвращаемое значение в функции Void (Swift 2.0)

    статический статический URL-адрес django

    Как сравнить два числа с плавающей запятой в Bash?

    Как рекурсивно перечислить все файлы в каталоге на C #?

    Как решить / взломать полупрозрачную ошибку PNG в IE8?

    Не удается завершить установку kali linux без cd или usb, но я не использую ни

    Лучшая клавиатура со встроенным указывающим устройством для медиацентра Mac?

    Как создать фильм из нескольких .bmp-файлов под Linux?

    Как напрямую выбрать один и тот же столбец из всех вложенных списков в списке?

    Пакетное переименование изображений численно?

    Давайте будем гением компьютера.