快速换弦的字符串

时间:2013-11-24 15:44:48

标签: c string

我有一个字符串This is a text,我想把它移到左边。 所以,当我希望它转换为2个位置时,它应该导致is is a textTh

出于某种原因,我无法到达那里。

void rotLeft(char *s, unsigned int n)
{
    char *t = malloc(sizeof(char) * n);
    int i;
    int ti = 0;

    for(i = 0; i < n; i+=1)
    {
        t[ti] = s[i];
        ti +=1;
    }

    // + n should remove the n first chars?
    strcat(s + n, t);
}

4 个答案:

答案 0 :(得分:1)

你只需要一个临时变量,这会旋转 ONCE n是字符串的长度。

void rotLeft(char *s, int n)
{
    char temp;
    int i;
    temp = s[0];
    for(i = 0; i < n-1; i++)
    {
        s[i] = s[i+1];
    }
    s[n-1]=temp;

}

答案 1 :(得分:1)

void rotLeft(char *s, unsigned int n)
{
    char *t;
    int l;

    l = strlen(s);
    t = (char *)malloc(n);
    strncpy (t,s,n);
    strncpy (s,s+n,l-n);
    strncpy (s+l-n,t,n);
    free (t);   
}

请小心,不要尝试旋转超过弦长。不会根据错误检查参数值。

答案 2 :(得分:0)

我建议构建一个新的旋转字符串,而不是就地旋转现有的字符串。

char *rotLeft(char *s, int n)
{
    char * t = malloc((strlen(s) + 1) * sizeof(char))
    strncpy(t, s + n, strlen(s) - n);
    strncpy(t + strlen(s) - n, s, n);
    s[strlen(s)] = '\0';
    return t;
}

答案 3 :(得分:0)

这是在不使用临时存储的情况下就地旋转字符串的经典技巧(除了单个字符)。 (生产版本应检查旋转量是否太大。)

void reverse(char* s, size_t lo, size_t hi) {
  while(lo < hi) {
    char t = s[lo];
    s[lo++] = s[--hi];
    s[hi] = t;
  }
}

void rotate_left(char* s, size_t n) {
  size_t len = strlen(s);
  reverse(s, 0, n);
  reverse(s, n, len);
  reverse(s, 0, len);
}