2013-07-17 156 views
0

我是用一个char *数组部分字符串复制到其他的char *数组,我在想,如果这样做正确递增指针?

do { 
    *pntr1++ = *pntr2++ 
} while (*pntr2 != '\0'); 

是一回事

do 
{ 
    *indPtr = *wordPtr; 
    indPtr++; 
    wordPtr++; 
} while (*wordPtr != '\0'); 

或将我最终跳过使用第一种方法的索引?

+0

你试过了吗?发生了什么? –

+1

@RogerRowland在可能未定义的行为的情况下,依靠某个特定实例中的“发生了什么”可能是一个糟糕的主意。 –

+2

是的,两者都是一样的:我更喜欢'while(* pntr1 ++ = * pntr2 ++);' –

回答

3

是的,这两者是等价的。后增加意味着之前的值在该表达式中使用了增量,并且该增量在表达式结尾处的序列点之前某个时间发生(或者,在C++术语中,“在下一个表达式之前被排序)。

因此,在这两种情况下,分配使用他们增加前的指针的值,并且比较\0使用它已经增加的指针的值。

如果您希望复制一个字符串,那会导致问题:至少在您显示的代码中,终止(假定)字符串的\0不会被复制(尽管您可以添加代码之后终止目标字符串)。

+0

是的,我刚刚遇到了这个问题,循环继续进行,直到数组中没有内存地址,因为增量语句跳过'\ 0'。有没有办法避免这种情况仍然会复制数组? – Bbvarghe

+0

@Bbvarghe:你通常想要'while((* d ++ = * s ++)!='\ 0'){}''这样你复制一个字节并立即检查该字节的值,并且如果它是你的终止。 –

+0

如何将语句'* d ++ = * s ++'与''\ 0''进行比较? – Bbvarghe

2

运营商++使用类似a++首先返回值a,然后增加它。

所以,代码

*a++ = *b++ 

*a = *b; 
a++; 
b++; 

是等同物。