//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 );
}
【剖析】