如何把char字串迴圈右移N位

2021-07-10 11:29:14 字數 1696 閱讀 1774

c語言實現:輸入乙個字串,將其迴圈右移n位。

1.利用strcpy()函式實現:

即將輸入pstr的後n位放入temp的前n位,再將pstr所有(到『\o』結束)放入temp的後面。

假如pstr="12345678",n(nbits)=3,則這時候,temp=「67812345678」,

所以再把temp後面多餘部分截掉,最後複製回pstr即完成。

2.利用memcpy()函式實現:

這是在網上看到的另外一種思路。

第一步還是同樣將pstr的後n位放入temp的前n位,

但是後面的**就讓人看不懂了。。

第二步它的目的是將pstr的前面部分(length-n)後移n位,就是直接把pstr的前面n個位置「讓」出來。但是————

可以這樣做?不是有重疊部分嗎?拷貝到第n位後會出錯吧?還沒拷貝出去就被覆蓋了呀?

帶著這樣的疑問,在我的windows電腦上測試執行:

(方法1和方法2對比結果)

執行結果:

居然是一樣的!!!也就是說方法2也是正確的。不敢相信我的眼睛。。。。。。

為什麼會這樣?

查閱了memcpy()的實現:

不同作業系統下對memcpy()的實現有所差別。

windows實現:

void * __cdecl memcpy (

void * dst,

const void * src,

size_t count

)#else 

while (count--)

#endif 

return(ret);

}而linux實現:

void *memcpy(void *dest, const void *src, size_t count)

所以在我自己的windows_64bits系統,是呼叫rtlmovememory( void *, const void *, size_t count )

實現。

再查到rtlmovememory

函式是支援重疊複製的,那麼當然memcpy()也支援重疊複製。

這讓人想起memcpy()的「兄弟」memmove(),它是支援重疊複製的。

所以得出結論:

在linux和win32環境下,用memcpy()實現的方法2是錯誤的。

而只有, 在win64環境下正確。

下面是在linux下的對memcpy()的驗證:

方法2的結果錯誤:

最後:慎用memcpy()!!!注意檢查是否有重疊!

字串迴圈右移

題目內容 輸入乙個字串和乙個非負整數 n,要求將字串迴圈右移n次。輸入格式 輸入在第 1行中給出乙個字串,以 表示結束,不是字串的一部分,字串的長度未知,但至少有乙個字元 輸入的第 2行給出非負整數n。輸出格式 在一行中輸出迴圈右移 n次後的字串。輸入樣例 hello world 2輸出樣例 d h...

字串迴圈右移

編寫乙個函式,作用是把乙個char組成的字串迴圈右移n個。比如原來是 abcdefghi 如果n 2,移位後應該是 hiabcdefg 函式頭是這樣的 pstr是指向以 0 結尾的字串的指標 steps是要求移動的n void loopmove char pstr,int steps 答案 incl...

字串迴圈右移

問題 編寫乙個函式,作用是把乙個char組成的字串迴圈右移m個。比如原來是 abcdefghi 如果m 2,移位後應該是 hiabcdefg 解法 解法一 使用strcpy void rightshifting char s,int step int main 解法二 使用memcpy void r...