我的字符串复制功能中这两个while循环条件之间的差异

时间:2016-10-14 22:28:02

标签: c++ c

我试图制作自己的字符串复制功能,而且我无法理解我的两个版本的函数中这两个代码片段之间的差异,我认为这些代码片段是等效的。

示例1

while (*str1 = *str2)
{
    str1++;
    str2++;
}

示例2

while (*str1)
{
    str1 = str2;
    str1++;
    str2++;
}

str1str2是传递给我的函数的两个字符串。

第一个例子按照我的预期工作,但第二个例子将我的字符串限制为第一个例子的长度。

所以,如果

str1ABCDEF

str2abcdefghijkl

我的字符串副本的第二个版本运行后

str1现在是abcdef

第一个按预期正常工作

str1现在是abcdefghijkl

我假设我的状况是罪魁祸首。两个条件(*str1)(*str1 = *str2)之间有什么区别?我还在学习C / C ++,如果这是一个菜鸟问题,那就很抱歉。

3 个答案:

答案 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!
     //....
}