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

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

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

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

Ответ 1

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

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

Ответ 2

#include <stdio.h>

int main(){
    char name[] =  "derp" "herp";
    printf("\"%s\"\n", name);//"derpherp"
    return 0;
}

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

Используйте Стек, Люк. Используйте его везде. Не используйте 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 Кбайт на строку не будет достаточно, добавьте нуль в размер и не беспокойтесь, - они все равно выпустят свою стекю в конце областей.

Ответ 6

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

Ответ 7

Без расширения 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;
}

См. malloc, free и asprintf для более подробной информации.

Ответ 8

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

Ответ 9

В C у вас действительно нет строк, как общего первоклассного объекта. Вы должны управлять ими как массивы символов, а это значит, что вам нужно определить, как вы хотите управлять своими массивами. Один из способов - это обычные переменные, например. помещенный в стек. Другой способ - динамически распределить их с помощью malloc.

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

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