[英]Concatenating two strings : C
考虑下面的代码,用delimiter
将两个char arrays
连接起来:
void addStrings(char* str1,char* str2,char del)
{
//str1=str1+str2
int len1=strlen(str1);
int len2=strlen(str2);
int i=0;
//char* temp=(char*) malloc((len1+1)*sizeof(char));
//strcpy(temp,str1);
str1=(char*) realloc(str1,(len1+len2+1)*sizeof(char));
printf("Here--%d\n",strlen(str1));
*(str1+len1)=del; //adding delimiter
for(i=0;i<=len2;i++)
*(str1+len1+i+1)=*(str2+i);
printf("Concatenated String: %s\n",str1);
i=0;
while( *(str1+i) != '\0')
{
printf("~~%d:%c\n",i,*(str1+i));
i++;
}
}
当使用addStrings("A","test",'@');
运行此函数时addStrings("A","test",'@');
; 代码崩溃,因为下面的realloc
是gdb output
Breakpoint 3, addStrings (str1=0x40212f <_data_start__+303> "A", str2=0x40212a <_data_start__+298> "test",
del=64 '@') at string.c:34
34 int len1=strlen(str1);
(gdb) s
35 int len2=strlen(str2);
(gdb) s
36 int i=0;
(gdb) s
39 str1=(char*) realloc(str1,(len1+len2+1)*sizeof(char));
(gdb)
Program received signal SIGABRT, Aborted.
0x004012f2 in addStrings (str1=0xc0 <Address 0xc0 out of bounds>,
str2=0xea60 <Address 0xea60 out of bounds>, del=0 '\000') at string.c:39
39 str1=(char*) realloc(str1,(len1+len2+1)*sizeof(char));
无法弄清楚为什么它崩溃了? 是因为我将str1
作为auto
变量传递,而不是在heap
创建它吗?
如果是这样的话? 如何修改代码以接受auto
变量和heap
变量?
您需要按地址传递目标字符串指针,并且它必须保存先前分配的字符串的地址或NULL(如果编码正确)。 大小分配必须为两个长度+ 2(熟食分隔符一个,终止符一个)。 结果可能如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void addStrings(char** str1, const char* str2,char del)
{
size_t len1 = *str1 ? strlen(*str1) : 0;
size_t len2 = str2 ? strlen(str2) : 0;
char *res = realloc(*str1, len1 + len2 + 2);
if (res)
{
res[len1] = del;
memcpy(res + len1 + 1, str2, len2);
res[len1 + 1 + len2] = 0;
*str1 = res;
}
}
int main()
{
char *p = NULL;
const char test[] = "test";
int i=0;
// prove it works with no input whatsoever
addStrings(&p, NULL, 'X');
printf("p = %p, %s\n", p, p);
// loop on some input for awhile
for (;i<10;++i)
{
addStrings(&p, test, '@');
printf("p = %p, %s\n", p, p);
}
free(p);
return 0;
}
产量
p = 0x128610, X
p = 0x128610, X@test
p = 0x128610, X@test@test
p = 0x128620, X@test@test@test
p = 0x128620, X@test@test@test@test
p = 0x128620, X@test@test@test@test@test
p = 0x128620, X@test@test@test@test@test@test
p = 0x128640, X@test@test@test@test@test@test@test
p = 0x128640, X@test@test@test@test@test@test@test@test
p = 0x128640, X@test@test@test@test@test@test@test@test@test
p = 0x128670, X@test@test@test@test@test@test@test@test@test@test
编译:Apple LLVM版本5.1(clang-503.0.40)(基于LLVM 3.4svn)目标:i386-apple-darwin13.2.0线程模型:posix
注意某些通行证中结果地址的变化。 我将检查有效的参数输入留给您作为练习。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.