如何连接C中的两个string?

我如何添加两个string?

我试过name = "derp" + "herp"; ,但我得到一个错误:

expression式必须有整型或枚举types

C不支持其他语言所具有的string。 C中的string只是指向由第一个空字符结尾的char数组的指针。 C中没有string连接运算符

使用strcat连接两个string。 你可以使用下面的函数来做到这一点:

 #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 

如果您确实碰巧受到性能的困扰,那么您会希望避免反复扫描input缓冲区以寻找空终止符。

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

如果你打算用string做很多工作,那么使用不同的语言对string有一stream的支持。

 #include <stdio.h> int main(){ char name[] = "derp" "herp"; printf("\"%s\"\n", name);//"derpherp" return 0; } 

David Heffernan在他的回答中解释了这个问题,我写了改进的代码。 见下文。

一个通用函数

我们可以编写一个有用的可变参数来连接任意数量的string:

 #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 。 谷歌它(关键字是“串联”)。

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

使用堆栈,卢克。 随处使用。 不要使用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); } } 

如果每个string10KB不够用,那么在这个大小上加一个0就不用担心了 – 他们会在作用域的末尾释放堆栈的内存。

你不能像在C中那样添加string字面值。你必须创build一个string大小的string文字1 +string文字2 +一个字节为空终止字符 ,并将相应的文字复制到该缓冲区,并确保它是空终止。 或者你可以使用像strcat这样的库函数。

没有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 。

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

在C中,你并没有真正的string,作为一个通用的第一类对象。 你必须将它们作为字符数组来pipe理,这意味着你必须确定你想如何pipe理你的数组。 一种方法是正常的variables,例如放在堆栈上。 另一种方法是使用mallocdynamic分配它们。

一旦你有了sorting,你可以将一个数组的内容复制到另一个,以使用strcpystrcat连接两个string。

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