C 弦的快移字符

C 弦的快移字符,c,string,C,String,我有一个字符串这是一个文本,我想把它移到左边。 所以,当我想让它移动两个位置时,它应该会导致是一个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 +

我有一个字符串
这是一个文本
,我想把它移到左边。
所以,当我想让它移动两个位置时,它应该会导致
是一个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);
}
void rotleet(字符*s,无符号整数n)
{
char*t=malloc(sizeof(char)*n);
int i;
int ti=0;
对于(i=0;i
您只需要一个临时变量,它将旋转一次
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;

}
void rotlef(字符*s,整数n)
{
焦炭温度;
int i;
温度=s[0];
对于(i=0;i

只要小心,不要试图旋转超过绳子的长度。参数值未针对错误进行检查。

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

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;
}

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

void reverse(字符数、大小低、大小高){
while(lo
AKA,您想交换字符的位置是字符串的长度还是移位量?如果是第一个,那么我假设函数向左旋转1个字符。请注意,
ti
i
始终具有相同的值:都初始化为0,都递增1。这不是你想要的。您希望
ti
i
后退一步,因此s的位置1处的字符被复制到t的位置0处的字符,位置2处的字符被复制到位置1处,依此类推。@Farseer否,
s
是一个指针,所以
s+n
=
s+n*sizeof(*s)
字节。@IMX您理解错了。将字符串的长度作为参数n传递,然后它将旋转一次。根据需要调用这个函数,但我不需要它旋转一次。我只需要它旋转n(比如说2)个字符。然后调用这个函数两次!不抱歉,我实际上+1这个,但不知怎么的,有另一个答案有内存泄漏,但它消失了,所以我一定是不小心把它贴在这里:P对不起,你能证明一下,为什么他不应该在原地旋转吗?我喜欢我的字符串不可变,只是我个人的喜好。而且你似乎也喜欢内存泄漏,通过分配您没有释放的内存,并且在函数中执行分配,调用您函数的人在读取源代码之前不会知道这一点。如果您不喜欢更改
s
,只需添加另一个参数作为目标字符串。哦,我喜欢内存泄漏!说真的,我假设我已经掌握了C如何处理记忆的实用知识,我是否总是需要在你之后详细说明如何清理?在编写库时,通常的做法是将这样的信息放在文档字符串中,这样就不必读取源代码。我这里没有,处理它。t=malloc(n+1);不需要强制转换,但需要分配足够的空间。
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;
}
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);
}