字符串左旋

方法一:创建一个循环可以左移一个字符,需要左移几个字符就做几次循环即可

void leftround(char arr1[], int sz, int a)
{
    int i = 0;
    int ret = 0;
    a %= sz;//如果旋转的次数大于所需要旋转的字符串,我们可以除以字符串的长度,得余数,例如
      输入的a=7,超过了字符串“ABCD”,只需要求7%4的余数即可   
    for (i = 0; i < a; i++)
    {//循环执行一次即可左移一个字符
        int j = 0;
        char tmp = arr1[0];//将字符串的首字符存储起来
        while (j < sz - 1)
        {
            arr1[j] = arr1[j + 1];//将字符串的第二个字符存储到字符串的第一个位置
            j++;
        }
        arr1[sz - 1] = tmp;//将第一个字符赋值给字符串的最后,就完成了一个字符串的左移
    }
}

int main()
{
    int a = 0;
    scanf("%d", &a);//输入需要旋转几个字符
    int sum = 0;
    char arr1[] = "ABCD";
    int sz = strlen(arr1);//求字符串长度
    leftround(arr1, sz, a);
    printf("%s", arr1);
}

方法二:创建一个数组,将不需要转移的拷贝的存放在前面,需要左移的存放在后边

#include<stdio.h>
#include<string.h>
void leftround(char *arr1, int sz, int  a)
{
    int b = a%sz;  //断开位置的下标 例如a=2,“AB”即为左移的字符,“CD”为断开的位置
    char tmp[256] = { 0 };//创建一个数组
    strcpy(tmp, arr1 + b);//arr+b为所拷贝的对象,tmp是要拷贝到的地方。这里是将“CD”拷贝到tmp
    strncat(tmp, arr1, b);//将“AB”拷贝到“CD”的后面
    strcpy(arr1, tmp);//将tmp里的“CDAB”重新放回arr1,就实现了字符串的左移
}
int main()
{
    int a = 0;
    scanf("%d", &a);
    int sum = 0;
    char arr1[] = "ABCD";
    int sz = strlen(arr1);
    leftround(arr1, sz, a);
    printf("%s", arr1);
}

strcpy函数:用于对字符串进行复制(拷贝)。

char* strcpy(char* strDestination, const char* strSource);

#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[50] = { 0 };
    char arr2[] = "abcdef";
    strcpy(arr1, arr2);
    printf("%s\n", arr1);
}

strncat函数: 库函数 char *strncat(char *dest, const char *src, size_t n)src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。

#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[50] = "ab";
    char arr2[50] = "cdef";
    int sz=strlen(arr2);
    strncat(arr1, arr2,sz);
    printf("%s\n", arr1);
}

方法三:先将要左旋的前二个家伙逆序(BACD),然后将后半段也逆序(BADC),最后整体逆序(CDAB)即可

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

void reverse_part(char *str,int start,int end)
{
    int i, j;
    char tmp;
    for (i = start, j = end; i < j; i++, j--)
    {
        tmp = str[i];
        str[i] = str[j];
        str[j] = tmp;
    }
}


void left_round(char *arr1,int sz, int a)
{
    int b = a%sz;//断开位置的下标  
    reverse_part(arr1, 0, b - 1);//逆序函数,将需要左旋的逆序
    reverse_part(arr1, b, sz-1);//将不需要左旋的逆序
    reverse_part(arr1, 0, sz-1);//整体逆序

}
int main()
{
    int a = 0;
        scanf("%d", &a);
        int sum = 0;
        char arr1[] = "abcd";
        int sz = strlen(arr1);
        left_round(arr1, sz, a);
        printf("%s", arr1);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值