C/C++ strcpy字符串拷贝函数问题
char*strcpy2(char*strDest,constchar*strSrc){ASSERT((strDest!=NULL)&&(strSrc!=NULL));c...
char *strcpy2(char *strDest, const char *strSrc)
{
ASSERT((strDest!=NULL) && (strSrc !=NULL));
char *address = strDest;
*strDest=*strSrc;
while (*strDest!='\0')
{
*strDest++;
*strSrc++;
*strDest=*strSrc;
}
return address;
}
char *strDest是说 strDset是字符串指针吧,那么 上面用到的*strDest是什么? 指针的指针?为什么不直接用 strDset 与strSrc进行操作呢?
我尝试了,没实现,如果可以实现应该怎么写?
还有就是如果我这么写:
char *asd1=new char[10];
char *asd2=new char[10];
asd2="asd1231231";
strcpy2(asd1,asd2);成功
asd1如果写成:
char *asd1=new char[10];
asd1="1234567890"; 系统崩溃! 难道说不能赋值?
而且不给asd1分配空间大小 他也会崩溃! 为什么?
char asd[10]; 是什么意思?char类型数组?那么例如asd[0]里面存储的是一个char类型数据?也就是说1个字节? 那么在strcpy指针移动的时候 指针就是数组指针了吗?
分不够可以加!!!谢谢大家!!
你们的答案 都不太一样啊!首先
1我复制 那个asd1231231的确是10个+上\0越界了 这个我承认!然而其他的问题 我不知道该听你们谁的! 展开
{
ASSERT((strDest!=NULL) && (strSrc !=NULL));
char *address = strDest;
*strDest=*strSrc;
while (*strDest!='\0')
{
*strDest++;
*strSrc++;
*strDest=*strSrc;
}
return address;
}
char *strDest是说 strDset是字符串指针吧,那么 上面用到的*strDest是什么? 指针的指针?为什么不直接用 strDset 与strSrc进行操作呢?
我尝试了,没实现,如果可以实现应该怎么写?
还有就是如果我这么写:
char *asd1=new char[10];
char *asd2=new char[10];
asd2="asd1231231";
strcpy2(asd1,asd2);成功
asd1如果写成:
char *asd1=new char[10];
asd1="1234567890"; 系统崩溃! 难道说不能赋值?
而且不给asd1分配空间大小 他也会崩溃! 为什么?
char asd[10]; 是什么意思?char类型数组?那么例如asd[0]里面存储的是一个char类型数据?也就是说1个字节? 那么在strcpy指针移动的时候 指针就是数组指针了吗?
分不够可以加!!!谢谢大家!!
你们的答案 都不太一样啊!首先
1我复制 那个asd1231231的确是10个+上\0越界了 这个我承认!然而其他的问题 我不知道该听你们谁的! 展开
5个回答
展开全部
先回答你的问题,看来你不懂什么是指针,什么是字符数组和字符串的区别。
char *strDest是说 strDset是字符串指针,它指向的地址里面存放的数据是char类型的。
strDest是char*类型的指针,而指针strDest前面加*号,表示取指针指向的地址中的值。
所以,*strDest是取指针strDest指向的地址里面的内容,也就是说*strDest是char类型的值
这就是“直接用 strDset 与strSrc进行操作”啊,你为什么说它“不直接”呢?
难道你还想直接对指针赋值,如strDset = strSrc,这只改变指针的指向而已
并没有改变指针指向的地址里面的内容,这种操作是错误的,下面详细分析
char *asd1=new char[10]; //给指针asd1分配了一块10字节的内存
char *asd2=new char[10]; //给指针asd2分配了一块10字节的内存
asd2="asd1231231"; //改变了指针asd2的指向,它从新指向了常量字符串"asd1231231"的地址
//这种操作是错误的。因为本来asd2指向刚分配的10字节的内存,改变指向后,刚分配的内存,就无法释放了,从而造成了内存泄漏,运行你的程序,内存会越来越少,系统会越来越慢的
strcpy2(asd1,asd2);//虽然能成功,但常量字符串“asd1231231”占11个字节,因为它后面有字符串的结束符号‘\0’,从而,会导致asd1的内存越界。
char *asd1=new char[10];
asd1="1234567890"; //指针asd1指向了常量字符串,常量是不能改变的
strcpy2(asd1,asd2);//如果再想用asd2指向的数据,赋值给asd1指向的地址,当然会导致系统崩溃!因为你在试图修改常量的值
char asd[10];//是10个char类型元素的字符数组,asd[0]里面存储的是一个char类型数据,是1个字节
//在strcpy指针移动的时候 指针是char*类型指针,是字符串指针
//而不是数组指针,数组指针是指向数组的指针,你根本不懂什么是数组指针
再评论一下各位网友的解答吧。
meteortent,没有理解“系统崩溃”的意思,它没明白怎么做会系统崩溃。
kungfu0101,的第2条不妥,虽然“形参值的改变不能改变实参的值”没错,但这不是strcpy不这样实现的原因,真正原因是strcpy的需求,决定了它的实现
asdf_12346,“*strDest++; 写法有问题”,其实写成“strDest++;”更好,它那样写程序也不会出错,只是有点多余。
ks6466686,strDest是指针,*strDest是是取指针指向的地址里面的值
char *strDest是说 strDset是字符串指针,它指向的地址里面存放的数据是char类型的。
strDest是char*类型的指针,而指针strDest前面加*号,表示取指针指向的地址中的值。
所以,*strDest是取指针strDest指向的地址里面的内容,也就是说*strDest是char类型的值
这就是“直接用 strDset 与strSrc进行操作”啊,你为什么说它“不直接”呢?
难道你还想直接对指针赋值,如strDset = strSrc,这只改变指针的指向而已
并没有改变指针指向的地址里面的内容,这种操作是错误的,下面详细分析
char *asd1=new char[10]; //给指针asd1分配了一块10字节的内存
char *asd2=new char[10]; //给指针asd2分配了一块10字节的内存
asd2="asd1231231"; //改变了指针asd2的指向,它从新指向了常量字符串"asd1231231"的地址
//这种操作是错误的。因为本来asd2指向刚分配的10字节的内存,改变指向后,刚分配的内存,就无法释放了,从而造成了内存泄漏,运行你的程序,内存会越来越少,系统会越来越慢的
strcpy2(asd1,asd2);//虽然能成功,但常量字符串“asd1231231”占11个字节,因为它后面有字符串的结束符号‘\0’,从而,会导致asd1的内存越界。
char *asd1=new char[10];
asd1="1234567890"; //指针asd1指向了常量字符串,常量是不能改变的
strcpy2(asd1,asd2);//如果再想用asd2指向的数据,赋值给asd1指向的地址,当然会导致系统崩溃!因为你在试图修改常量的值
char asd[10];//是10个char类型元素的字符数组,asd[0]里面存储的是一个char类型数据,是1个字节
//在strcpy指针移动的时候 指针是char*类型指针,是字符串指针
//而不是数组指针,数组指针是指向数组的指针,你根本不懂什么是数组指针
再评论一下各位网友的解答吧。
meteortent,没有理解“系统崩溃”的意思,它没明白怎么做会系统崩溃。
kungfu0101,的第2条不妥,虽然“形参值的改变不能改变实参的值”没错,但这不是strcpy不这样实现的原因,真正原因是strcpy的需求,决定了它的实现
asdf_12346,“*strDest++; 写法有问题”,其实写成“strDest++;”更好,它那样写程序也不会出错,只是有点多余。
ks6466686,strDest是指针,*strDest是是取指针指向的地址里面的值
展开全部
是的,如果传值,strDest++你怎么解释?无法操作了啊,而指针去可以
char *asd1=new char[10];
char *asd2=new char[10];
asd2="asd1231231";
strcpy2(asd1,asd2);成功
char *asd1=new char[10];
asd1="1234567890"; 系统崩溃! 难道说不能赋值?
你确定吗?上面成功下面失败?
char asd[10]; 是char类型数组,数组指针 同有这个概念,数组本身不是数据类型,那数据指针是啥意思呀?指向数组的指针??
char *asd1=new char[10];
char *asd2=new char[10];
asd2="asd1231231";
strcpy2(asd1,asd2);成功
char *asd1=new char[10];
asd1="1234567890"; 系统崩溃! 难道说不能赋值?
你确定吗?上面成功下面失败?
char asd[10]; 是char类型数组,数组指针 同有这个概念,数组本身不是数据类型,那数据指针是啥意思呀?指向数组的指针??
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
*strDest是指针啊, 是字符指针, 可以存储一个字符串,不是 字符串指针呢.
那样的话,通过传递 参数,可以将 一个地址传递给Strcpy2函数,函数对*strDest
操作就是对原来的数据进行操作!而且支持 指针的 操作(这两点是最主要的!)
而strDest就不行啦.
1.你定义了 多大的数组, 赋值的时候,只能 填n-1个字符;
2.关于 strcopy函数:
*strDest=*strSrc; ------(1)
while (*strDest!='\0')
{
*strDest++; ------------(2)
*strSrc++; -------------(3)
*strDest=*strSrc; ------(4)
}
(1).表示将strDest地址对应的赋值为 *strSrc;注意这里是传值赋值,不是用指针赋值的!
(2)(3)一样,但要注意,不要被*给迷惑了,这里++的优先级高!!所以这两句 前面的*去掉也行!你可以去试试!
(4)跟(1)一样,也是 赋值!!
好了 LZ这下应该 懂啦 呵呵
那样的话,通过传递 参数,可以将 一个地址传递给Strcpy2函数,函数对*strDest
操作就是对原来的数据进行操作!而且支持 指针的 操作(这两点是最主要的!)
而strDest就不行啦.
1.你定义了 多大的数组, 赋值的时候,只能 填n-1个字符;
2.关于 strcopy函数:
*strDest=*strSrc; ------(1)
while (*strDest!='\0')
{
*strDest++; ------------(2)
*strSrc++; -------------(3)
*strDest=*strSrc; ------(4)
}
(1).表示将strDest地址对应的赋值为 *strSrc;注意这里是传值赋值,不是用指针赋值的!
(2)(3)一样,但要注意,不要被*给迷惑了,这里++的优先级高!!所以这两句 前面的*去掉也行!你可以去试试!
(4)跟(1)一样,也是 赋值!!
好了 LZ这下应该 懂啦 呵呵
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个涉及很多基础知识。
首先我认为你写的那个strcpy2有问题。
*strDest++;
*strSrc++;
这两块前面都不应该加*,你这里明显是指针后移,而不是字符ASCII码加1,因此不能用*操作符取值。
其次,下面你给的那个系统崩溃的代码,其实是一个初学者很容易犯的错误。
char asd[10],定义的字符数组只能容纳10个字符,但是你
asd1="1234567890";这样给它赋值了一个字符串,字符串最后要以'\0'结尾的,这样就是11个字符,肯定数组越界了。数组越界了导致的结果是不可预测的,可能一切正常,也可能当场崩溃。
像你给的第一次成功那是运气好,第一次你赋值asd2="asd1231231"; 这个也越界了。
首先我认为你写的那个strcpy2有问题。
*strDest++;
*strSrc++;
这两块前面都不应该加*,你这里明显是指针后移,而不是字符ASCII码加1,因此不能用*操作符取值。
其次,下面你给的那个系统崩溃的代码,其实是一个初学者很容易犯的错误。
char asd[10],定义的字符数组只能容纳10个字符,但是你
asd1="1234567890";这样给它赋值了一个字符串,字符串最后要以'\0'结尾的,这样就是11个字符,肯定数组越界了。数组越界了导致的结果是不可预测的,可能一切正常,也可能当场崩溃。
像你给的第一次成功那是运气好,第一次你赋值asd2="asd1231231"; 这个也越界了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、char *strDest是说 strDset是字符串指针, 而 *strDest 是 char
2、不直接用 strDset 与strSrc进行操作是因为形参的值的改变不能改变实参的值
3、char *asd1=new char[10]; 只能写9个有效字符进去,因为还有一个空间留给'\0'
2、不直接用 strDset 与strSrc进行操作是因为形参的值的改变不能改变实参的值
3、char *asd1=new char[10]; 只能写9个有效字符进去,因为还有一个空间留给'\0'
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询