我正在学习C语言......
我想编写一个连接两个字符串的函数。 我写了一个函数,但它不起作用; 它在编译时没有任何错误, 但是在运行它时什么都不做。
这是我的代码:
char* str_sum(char* s1, char* s2){
int j = strlen(s1);
int i=0;
while(s2[i]){
s1[j]=s2[i];
j++;
i++;
}
return s1;
}
int main(){
char* s1, s2;
s1 = "Joe";
s2 = "Black";
printf("%s\n",sum_str(s1,s2));
return 0;
}
答案 0 :(得分:2)
您的功能可能如下所示:
char* sum_str(char* s1, char* s2)
{
int lenS1 = strlen(s1);
int lenS2 = strlen(s2);
char* newString = malloc((lenS1 + lenS2 + 1) * sizeof(char));
int i = 0;
while(i < lenS1)
{
newString[i] = s1[i];
i++;
}
while(i < lenS2 + lenS1)
{
newString[i] = s2[i - lenS1];
i++;
}
newString[i] = '\0';
return newString;
}
请注意,此函数会分配新字符串,这意味着当您使用此字符串时,您应该free
此数据。另请注意,终止字符('\0'
)存储在此char数组的末尾,以便printf
可以正确“打印”它。
主要是:
int main()
{
char *s1, *s2, *s3;
s1 = "Joe";
s2 = " Black";
s3 = sum_str(s1,s2);
printf("%s\n", s3);
free(s3);
return 0;
}
输出:Joe Black
请注意,我已声明变量s1
,s2
和s3
,如下所示:char *s1, *s2, *s3;
。如果我这样写:char *s1, s2, s3;
那么变量s2
和s3
不再是字符数组而只是字符。
另请注意此程序:
char *s1 = "Joe";
s1[0] = 'X';
printf("%s\n", s1);
会崩溃,因为它会尝试更改常量字符串文字"Joe"
。在这种情况下,s1
是指向此文字的第一个字符的指针。
但是这个程序运行正常,输出结果为Xoe
:
char s1[] = "Joe";
s1[0] = 'X';
printf("%s\n", s1);
s1
是使用字符串"Joe"
初始化的数组,因此可以更改它。
答案 1 :(得分:1)
这样的事情:
char* str_sum(char* s1, char* s2){
int len = strlen(s1) + strlen(s2);
char* buff = malloc(len * sizeof(char) + 1);
strcpy(buff, s1); //we don't need the zero termination char here.
strcpy(buff + strlen(s1), s2);
buff[len] = '\0';
return buff;
}
答案 2 :(得分:0)
代码有两个主要问题:
答案 3 :(得分:0)
您的函数不会分配内存来编写新字符串。也许你可以使用strcat
或者像这样重写它:
char* str_sum(char* s1, char* s2) {
int l1 = strlen(s1), l2 = strlen(s2), i;
char sum = (char *)malloc(l1+l2+1);
for(i=0; i<l1; i++) sum[i] = s1[i];
for(i=0; i<l2; i++) sum[i+l1] = s2[i];
sum[l1+l2] = '\0'; // NULL terminated
return sum;
}
答案 4 :(得分:0)
您的str_sum
函数需要创建一个足以容纳连接字符串内容的数组。
char *str_sum( const char *s1, const char *s2 )
{
char *ret = malloc( strlen(s1) + strlen(s2) + 1 ); // 1 for terminating NULL char
if( ret == NULL ) {
return NULL;
}
strcpy( ret, s1 );
strcpy( &ret[strlen(s1)], s2 );
return ret;
}
此外,调用者需要free()
返回的指针(如果它不是NULL)。
答案 5 :(得分:0)
你可以用strcat()做到这一点 或者没有(这是毫无意义的,但为了完整起见,我将其包括在内。请参阅下面的例子。
char* str_sum_wstrcat(char* s1, char* s2)
{
int len1 = strlen(s1);
int len2 = strlen(s2);
int i=0;
char* sum = malloc(len1+len2+1);
strcpy(sum,s1);
strcat(sum,s2);
return sum;
}
char* str_sum(char* s1, char* s2)
{
int len1 = strlen(s1);
int len2 = strlen(s2);
int i=0;
char* sum = malloc(len1+len2+1);
strcpy(sum,s1);
while(i<len2)
{
sum[len1+i] = s2[i];
i++;
}
sum[len1+i]='\0';
return sum;
}
int main()
{
char* s1 = malloc(100);
char* s2 = malloc(100);
s1 = "Joe";
s2 = "Black";
printf("%s\n",str_sum(s1,s2));
//or
printf("%s\n",str_sum_wstrcat(s1,s2));
return 0;
}
答案 6 :(得分:0)
您正在做的事情会导致细分错误。字符串文字可能位于内存的只读部分。如果您尝试写入这样的位置,则会出现运行时错误。正如其他答案所说,请使用malloc
。包括我在内的许多初学者都犯了一个错误。
答案 7 :(得分:0)
这是一种没有任何预定义功能的方法。连接的结果放在函数的第三个参数中,即结果字符串:
void str_cat_101(char const input1[], char const input2[], char result[])
{
int i, z;
for(i = 0; input1[i] != 0; i++)
{
result[i] = input1[i];
}
for(z=0; input2[z] != 0; z++)
{
result[i+z] = input2[z];
}
result[i+z] = 0;
}