我试图制作自己的字符串复制功能,而且我无法理解我的两个版本的函数中这两个代码片段之间的差异,我认为这些代码片段是等效的。
示例1
while (*str1 = *str2)
{
str1++;
str2++;
}
示例2
while (*str1)
{
str1 = str2;
str1++;
str2++;
}
str1
和str2
是传递给我的函数的两个字符串。
第一个例子按照我的预期工作,但第二个例子将我的字符串限制为第一个例子的长度。
所以,如果
str1
是ABCDEF
str2
是abcdefghijkl
我的字符串副本的第二个版本运行后
str1
现在是abcdef
第一个按预期正常工作
str1
现在是abcdefghijkl
我假设我的状况是罪魁祸首。两个条件(*str1)
和(*str1 = *str2)
之间有什么区别?我还在学习C / C ++,如果这是一个菜鸟问题,那就很抱歉。
答案 0 :(得分:5)
str1 = str2
和*str1 = *str2
之间存在巨大差异。第一个将指针str2
中的地址分配给指针str1
。第二个将str2
指向的元素分配给str1
指向的空格。
while
条件也有点不同:
while (*str1 = *str2)
有效地检查了此分配的结果 - *str2
。
答案 1 :(得分:1)
在第二个版本中,str1 ++增加指针以旋转字符串。
while(* str1)
在每次增量后询问当前位置的值是否为空。如果是,则while循环退出(因此它只会经过str1很长的次数)。
第一个版本是特别差的代码(IMO)。我永远不会在while表达式中进行赋值和测试。阅读此代码的人中有90%不会看到这一点,因为没有人会在一段时间内或在测试中进行分配。
编辑:更改百分比。
答案 2 :(得分:1)
第一个将str2的值赋给str1,所以如果str2的值为null,则条件失败。
如果str2大于str1将会写入str1的出站,从而导致段错误。
第二个扫描str1的值,只要它不是null终止符就返回true,因此它会继续,直到达到null终止符然后它就会中断。
注意:
在第二个内部循环中,你使指针str1指向指针str2指向的位置!所以,如果它们是动态分配的,那么你好“内存泄漏”。
char* str1 = new char[10];
char* str2 = new char[20];
while(*str1)
{
str1 = str2; // Memory leak you should cleaned str1 before here!
//....
}