如何在C中连接两个字符串?

时间:2011-12-11 15:11:36

标签: c string

如何添加两个字符串?

我尝试了name = "derp" + "herp";,但收到了错误:

  

表达式必须具有整数或枚举类型

11 个答案:

答案 0 :(得分:143)

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

如果您计划使用字符串进行大量工作,那么最好使用具有一流字符串支持的其他语言。

答案 1 :(得分:17)

#include <stdio.h>

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

答案 2 :(得分:12)

David Heffernan explained他的答案中的问题,我写了改进的代码。见下文。

通用函数

我们可以编写一个有用的variadic function来连接任意数量的字符串:

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

答案 3 :(得分:8)

您应该使用strcat或更好的strncat。 Google it(关键字是“连接”)。

答案 4 :(得分:6)

我假设您需要一次性的东西。我假设您是PC开发人员。

使用Stack,Luke。到处使用它。不要使用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 KB还不够,那么在大小上添加一个零并且不要打扰,他们会在范围结束时释放他们的堆栈内存。

答案 5 :(得分:5)

你不能在C中添加像这样的字符串文字。你必须创建一个大小为字符串文字的缓冲区1 +字符串文字2 +一个字节用于空终止字符并将相应的文字复制到缓冲区并确保它以null终止。或者您可以使用strcat等库函数。

答案 6 :(得分:3)

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

有关详细信息,请参阅mallocfreeasprintf

答案 7 :(得分:2)

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

答案 8 :(得分:2)

连接字符串

用至少3种方法来连接C中的任何两个字符串:-

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]!='\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 <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)通过使用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;
}

答案 9 :(得分:0)

在C中,你没有真正的字符串,作为通用的第一类对象。您必须将它们作为字符数组进行管理,这意味着您必须确定如何管理数组。一种方法是正常变量,例如放在堆栈上。另一种方法是使用malloc动态分配它们。

如果已对其进行排序,则可以将一个数组的内容复制到另一个数组,以使用strcpystrcat连接两个字符串。

话虽如此,C确实有“字符串文字”的概念,这是在编译时已知的字符串。使用时,它们将是放置在只读存储器中的字符数组。但是,可以通过将它们彼此相邻地连接起来来连接两个字符串文字,如"foo" "bar",这将创建字符串文字“foobar”。

答案 10 :(得分:0)

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