如何在C中向左或向右旋转给定的字符串?

时间:2009-11-05 06:33:36

标签: c

C函数将字符串向右或向左旋转给定数字。当角色根据方向旋转超过字符串的结尾或开头时,它应该环绕

4 个答案:

答案 0 :(得分:10)

给定一个字符str,其长度为length,轮换金额为n

向左旋转相当于

reverse(str, 0, n);
reverse(str, n, length);
reverse(str, 0, length);

向右旋转等同于

reverse(str, 0, length - n);
reverse(str, length - n, length);
reverse(str, 0, length);

现在你只需要一个反向功能。

更新: 我想到了如何使用mod来让你总是按照n的符号向正确的方向旋转。

e.g。

int mod = n % length;
if (mod != 0) { //if 0, don't rotate
    reverse(str, 0, mod);
    reverse(str, mod, length);
    reverse(str, 0, length);
}

经历各种情况

如果n == 5且长度= 10,则mod = 5

如果n == 16且长度= 10,mod = 6 - 向左旋转16 =向左旋转6

如果n == 0且长度=任何东西,mod = 0

如果n == -1且长度= 10,mod = 9 - 向右旋转1与向左旋转9相同

如果n == -15且长度= 9,mod = 3 - 向右旋转15与向左旋转3相同

答案 1 :(得分:2)

我会做这样的事情:

void rot(char *buf, int len, int r)
{
  char *temp=malloc(r>=0?r:-r);
  if(r>=0)
  {
    memcpy(temp, buf+len-r, r);
    memmove(buf+r, buf, len-r);
    memcpy(buf, temp, r);
  }
  else
  {
    memcpy(temp, buf, r);
    memmove(buf, buf+r, len-r);
    memcpy(buf+len-r, temp, r);
  }

  free(temp);
}

当然提供r< len,len至少为1,你知道,正常的卫生检查。

答案 2 :(得分:0)

答案 3 :(得分:0)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* strrot (int offset, size_t size, const char *inStr);

int main (int argc, const char * argv[]) {
    const char *rotStr = "rotateme";
    size_t rotStrSize = strlen(rotStr);
    char *resultStr;

    resultStr = strrot(-3, rotStrSize, rotStr);
    printf("-3, %s\n", resultStr);
    free(resultStr);

    resultStr = strrot(2, rotStrSize, rotStr);
    printf("+2, %s\n", resultStr);
    free(resultStr);

    resultStr = strrot(11, rotStrSize, rotStr);
    printf("+11, %s\n", resultStr);
    free(resultStr);

    resultStr = strrot(0, rotStrSize, rotStr);
    printf("0, %s\n", resultStr);
    free(resultStr);

    resultStr = strrot(-11, rotStrSize, rotStr);
    printf("-11, %s\n", resultStr);
    free(resultStr);

    return 0;
}

char* strrot (int offset, size_t size, const char *inStr) {
    char *result = (char *)malloc(size * sizeof(char));
    int trueOffset = size - (offset % size);

    int inIndex = trueOffset;
    int outIndex = 0;

    for (inIndex = trueOffset; inIndex < (int)size; inIndex++, outIndex++) {
        result[outIndex] = inStr[inIndex];
    }
    for (inIndex = 0; inIndex < trueOffset; inIndex++, outIndex++) {
        result[outIndex] = inStr[inIndex];
    }

    result[(int)size] = '\0';

    return result;
}

结果:

-3, atemerot
+2, merotate
+11, emerotat
0, rotateme
-11, atemerot