如何添加两个字符串?
我尝试了name = "derp" + "herp";
,但收到了错误:
表达式必须具有整数或枚举类型
答案 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;
}
答案 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
动态分配它们。
如果已对其进行排序,则可以将一个数组的内容复制到另一个数组,以使用strcpy
或strcat
连接两个字符串。
话虽如此,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);