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...