51Testing软件测试论坛
标题:
急,字符串连接不成功!
[打印本页]
作者:
bossy
时间:
2008-3-25 10:12
标题:
急,字符串连接不成功!
各位,怎样把两个字符串指针连接起来?我用strcat函数试过了也不行,代码如下:
char *test1 = "abcdef";
char *test2 = "ggeeff";
test1 = (char *)malloc(sizeof(test1) + sizeof(test2));
strcat(test1,test2);
lr_output_message("%s",test1);
test1
输出的是:
?<ggeeff
,请帮下忙!
作者:
mythxhg
时间:
2008-3-25 12:03
不应该这样写代码的吧
test1无论指针指向的内容是多长,sizeof(test1)都是4,因为char*指针本身字长就是4
test2也是同理.
你用sizeof(test1)+sizeof(test2)就是8
所以你test1 = (char *)malloc(sizeof(test1) + sizeof(test2));实际上等于
test1 = (char *)malloc(8);也就是test1现在是一个长度为8的内存空间的指针.
strcat的使用中,test1最好使用数组,而不是指针,因为这样有可能会导致占用其他空间
因为
strcat是把源字符串附加到目的字符串的后面要先指向目的字符串的结尾,所以你申请了8位空间,但是没有初始化,所以字符结束"\0"有可能在任意的位置上出现,有可能在第一位就已经是字符结尾.也有可能在24位之后才遇到字符结尾
,所以你用
strcat(test1,test2)实际上就是要把一个长度为6的字符串添加到任意长度的字符数组中,因为test1长度不确定,不信你可以用strlen来查一下看看它到底多长
[
本帖最后由 mythxhg 于 2008-3-25 13:09 编辑
]
作者:
mythxhg
时间:
2008-3-25 12:25
现在看来是你哪还没初始化的test1在?<之后就遇到结束符了,所以你添加时当然是?<ggeeff
而且不单是语法上有问题,算法上也有问题啊,malloc之后test1就不再是"abcdef"了,这样还能做到2个字符串相加?
作者:
mythxhg
时间:
2008-3-25 13:02
举个例子吧
char *test1 = "abcdeasdf";
char *test2 = "abcdefghdgfhfgh";
char *test3 = (char *)malloc(sizeof(char*));
char *temp = test3;
int i = strlen(test1);
//先用循环把test1的值放到test3中
while((i--)>=0){
*temp++ = *test1++;
}
//最后加上结束符,也可以不加,其实上面已经在循环中加了,这里只是让读者明白一点
*temp++ = '\0';
//上面做的都是对内存初始化的工作,现在你才可以使用strcat
strcat(test3,test2);
当然,使用数组是最好的,因为你不需要自己进行初始化,但是如果你还是想用malloc,那就得做上面的工作了,
还有必要说明一下malloc这个函数,他是申请指定大小的内存并返回这写内存的首地址,上面可以看到我只申请了4位大小的内存,为什么可以装下那么多数据?
因为我们使用的时候有越界的操作了,如我们对从首地址起4位大小后还继续进行赋值并设置自己的结束符,这些都是在不安全的内存内进行的,
所以
有必要明白一点的是malloc分配内存的意义就是所这些指定大小的内存可以供你使用而且安全,不会有其他程序等对它进行修改,
所以我上面只用malloc(4)的情况下,从首地址起4位内才是安全的,4位后的内存有可能被其他程序等使用或者冲突,
所以规范的写法应该是malloc(strlen(test1)+strlen(test2)+1);
[
本帖最后由 mythxhg 于 2008-3-25 15:03 编辑
]
作者:
bossy
时间:
2008-3-26 08:49
很感谢您的解答,不过我看了您的例题后还有问题要问,为什么初始化test3的内存要先向test3内赋值?
作者:
mythxhg
时间:
2008-3-26 11:13
赋值只是为了把你TEST1的内容放到指定内存里才能用strcat把test2加到一起,这比步你可以不做,但是初始化是一定要的,上面我说了strcat的工作原理,所以你必须要为分配到的内存里写定结束符,所以才会有*temp++ = '\0';
你也可以malloc(strlen(test1)+strlen(test2)+1);分配到内存后马上为其第一位赋上结束符,只要有了结束符你才能正确的使用strcat,因为刚分配到的内存是没有经过初始化的,里面任意的地方都有可能出先结束符,甚至没有结束符.
作者:
mythxhg
时间:
2008-3-26 11:16
char *test1 = "abcdeasdf";
char *test2 = "abcdefghdgfhfgh";
char *test3 = (char *)malloc(strlen(test1)+strlen(test2)+1);
char *temp = test3;
int i = strlen(test1);
*test3 = '\0';
strcat(test3,test1);
strcat(test3,test2);
这样也可以....对比一下,关键就是在于malloc与strcat的关系,malloc分配内存,但里面内存的内容是不确定的,而strcat是需要遇到结束符之后才会向其后添加内容.
[
本帖最后由 mythxhg 于 2008-3-26 15:29 编辑
]
作者:
liubo
时间:
2010-4-25 23:09
标题:
回复 6# 的帖子
看了你的回答,我有个疑问
char *str1="abcdef";
char * str2="gfhi";
strcat(str1,str2);
这样为什么不行?
str1本身就是一个指针,并且初始化,也带有'\0'的结束符号.
另外上面的那种写法我在turbo C里也试过,是可以用的.
[
本帖最后由 liubo 于 2010-4-25 23:10 编辑
]
作者:
PrefTest
时间:
2010-4-26 11:03
char str1[128];
char *str2="gfhi";
strcpy(str1,"abcdef");
strcat(str1,str2);
lr_output_message("%s",str1);
LoadRunner的C编译器与其他的C编译器例如Turbo C、VC是不一样的
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2