//pStr是指向以'\0'结尾的字符串的指针
//steps是要求移动的n
void LoopMove ( char * pStr, int steps ) { //请填充... }
void LoopMove(char *pStr, int steps){ assert(pStr != NULL); int n=strlen(pStr); if (steps >= 0){ for (int i = 0; i < steps; i++){ char temp = pStr[n - 1]; for (int j = n - 1; j > 0; j--){ pStr[j] = pStr[j-1]; } pStr[0] = temp; } } else{ steps = -steps; for (int i = 0; i < steps; i++){ char temp = pStr[0]; for (int j = 0; j < n-1; j++){ pStr[j] = pStr[j + 1]; } pStr[n - 1] = temp; } } }
#include <stdio.h> #include <string.h> //pStr是指向以'\0'结尾的字符串的指针 //steps是要求移动的n void LoopMove(char * pStr, int steps) { int len = strlen(pStr); int st = steps % len; // 取余 // 字符串长度为0,或不需移动,或移动步数小于等于0.返回,也可报错。 if (len == 0 || st == 0 || steps <= 0) return; char temp[100] = {0}; memcpy(temp, pStr+len-st, st); memcpy(temp+st, pStr, len-st); memcpy(pStr, temp, len); } int main() { char s[128] = "abcd"; LoopMove(s, 5); printf("%s\n", s); return 0; }
void LoopMove ( char *pStr, int steps )
{
if(!pStr || steps<0) //非法输入
return;
int nLen=strlen(pStr);
if(0 == steps%/nLen) //能整除时不需移动
return;
char szTmp[MAX_LEN];
int nStep=steps%nLen;
memcpy(szTmp,&pStr[nLen-nStep],nStep);
memcpy(&pStr[nLen-nStep],pStr,nLen-nStep);
memcpy(pStr,szTmp,nStep);
}strcpy遇\0结束,可能会有问题。 当steps大于len时,需要做保护。用memcpy或者memmove保险.
#include <iostream> #include <string.h> using namespace std; void Reverse(char **pStr, int begin, int end) { while(begin < end - 1) { swap((*pStr)[begin], (*pStr)[end-1]); begin++; end--; } } void LoopMove(char *pStr, int steps) { if(pStr == NULL || steps < 1) return; int len = strlen(pStr); steps = steps % len; Reverse(&pStr, 0, len - steps); Reverse(&pStr, len - steps, len); Reverse(&pStr, 0, len); } int main() { char pStr[] = "abcdef"; LoopMove(pStr, 2); cout << pStr << endl; return 0; }
void Swap(char &a, char &b) { char temp = a; a = b; b = temp; } void Reverse(char **pStr, int beg, int end) { while (beg < end-1) { Swap((*pStr)[beg], (*pStr[end - 1])); beg++; end--; } } //step是右移的步数 void LoopMove(char *pStr, int steps) { int len = strlen(pStr); Reverse(&pStr, 0, len - steps); Reverse(&pStr, len - steps, len); Reverse(&pStr, 0, len); }仅表示思路,没考虑输入出错的情况
加上括号12行,一条龙服务。参考答案忽略了steps可能大于字符串长度的情况为了方便测试代码返回了char*char* LoopChar(char* str, int steps) { if (str == NULL || steps<0) return NULL; int num = strlen(str); char* strtmp = new char[2*num+1]; char* fstr = strcat(strcpy(strtmp, str),str); int fsteps = steps % num; for (int k = 0; k < num; k++) { str[k] = fstr[k+num-fsteps]; } return str; }
#include<iostream> #include<iomanip> #include <assert.h> using namespace std; #define MAXLEN 20 void LoopMove1(char *pStr, int steps) { assert(pStr != NULL); int len = strlen(pStr); int remain = len - steps; char tmp[MAXLEN];//[]; strcpy(tmp, pStr + remain); strcpy(tmp + steps, pStr); tmp[len] = '\0'; strcpy(pStr, tmp); } void LoopMove2(char *pStr, int steps) { assert(pStr != NULL); int len = strlen(pStr); int remain = len - steps; char tmp[MAXLEN]; memcpy(tmp, pStr + remain, steps); memcpy(tmp + steps, pStr, remain); memcpy(pStr, tmp, len); } int main() { char a1[] = "abcdefghi"; char a2[] = "abcdefghi"; LoopMove1(a1, 2); char*b = a1; LoopMove2(a2, 2); char*c = a2; return 0; }
memcpy(pStr, tmp, len); 或 strcpy(pStr, tmp);
#include<iostream> using namespace std; void LoopMoveChar(char* ch, int K) { if (ch == nullptr || K <= 0) return; int length = strlen(ch); //循环移位长度超过字符串长度 if(K>length) K = K % length; char temp[255];//存放后面会被覆盖的值 for (int i = 0; i < K; ++i) temp[i] = ch[length - K + i]; for (int i = length - 1; i >K-1; --i)//从后向前依次获得移位后的字符 ch[i] = ch[i - K]; for (int i = 0; i < K; ++i)//前K个值 ch[i] = temp[i]; }
void LoopMove ( char *pStr, int steps ) { int n = strlen( pStr ) - steps; char tmp[MAX_LEN]; strcpy ( tmp, pStr + n ); strcpy ( tmp + steps, pStr); *( tmp + strlen ( pStr ) ) = '\0'; strcpy( pStr, tmp ); }正确解答2:
void LoopMove ( char *pStr, int steps ) { int n = strlen( pStr ) - steps; char tmp[MAX_LEN]; memcpy( tmp, pStr + n, steps ); memcpy(pStr + steps, pStr, n ); memcpy(pStr, tmp, steps ); }【剖析】