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



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



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




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


808   10  

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

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

вы не можете добавить строковые литералы, как это в 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

    Ничего не найдено.