2013-07-17 73 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++; 

是等同物。