• C语言中关于字符串左右循环移位的问题


    今天再看面试题时 出现了一个字符串左右移动循环的问题,看了一遍还没有弄懂,就发了点时间来看了一下字符数组与字符指针的问题,最终还是得到解决,呵呵,只要肯发功夫,还是会有收获的

      例如:有一组char的字符串:abcdefghijk 。你要循环左移3位变成ijkabcdefgh(也有写出ijkabcdefghi);或右移三位变成defghijkabc(也有写成cdefghijkabc);

       首先我们来解决字符串循环右移的问题:

    方法一:利用已有的字符串函数。

    #include<stdio.h>

    #include<string.h>

    void rightloop(char *a, int n);

    main()

    {

    char a[100];   int n;

    printf("请输入要循环的字符串:\n");

    scanf("%s",a);

    printf("请输入要循环字符串的位数:\n");

    scanf("%d",&n);                                        \\以上代码也可以直接赋初值,我考虑的是一般情况\\

    void rightloop(a,n);                                     \\本例以a[]="abcdefghijk", n=3为例讲解\\

    printf("输出循环右移的字符串:%s\n",a);

    }

    void rightloop(char *a, int n)

    {

    char b[100];     \\数组b要做的够大即可\\

    int m;

    m=strlen(a)-n;               \\求出除去要循环右移之后剩下的字符的个数\\

    strcpy(b,a+n);            \\ a+n,a代表a[0]的地址再加上n,表示要把a[n]之后的字符串(即那些不用循环右移的字符,共有m个)复制到数组b中。这时b[]="defghijk"。 \\

    strcpy(b+m,a);                  \\ b+m, 因为上面已经把没有循环的m个字符赋给了b,所以b[m]之前的不能在赋值了,只能把a的全部字符串赋给b[m]之后的空间了。这时b[]="defghijkabcdefghijk"。\\

    *(b+strlen(a))='\0';               \\这里是问题的关键,要根据a字符串的长度来舍弃b数组中多余的字符串,并给数 组b加结束符。这时b[]="defghijkabc";\\

    strcpy(a,b);                                \\把数组b中调整好的字符串重新赋给数组a。\\

    }

    方法二:就是用简单的c语句;

    #include<stdio.h>

    void rightloop(char , int )

    main()

    {

    char a[100];   int n;

    printf("请输入要循环的字符串:\n");

    scanf("%s",a);

    printf("请输入要循环字符串的位数:\n");

    scanf("%d",&n);                                        \\以上代码也可以直接赋初值,我考虑的是一般情况\\

    void rightloop(a,n);                                    \\本例以a[]="abcdefghijk", n=3为例讲解\\

    printf("输出循环右移的字符串:%s\n",a);

    }

    void rightloop(char a[ ], int n)

    {

           int i=0,j=0,k=0;

            int m; char b[100];

    while(a[i]!='\0')

            { i++; }     \\这里用i来计算数组a中字符串的大小;\\

    while(a[n]!='\0')

    {

         b[j]=a[n]; j++; n++;

    \\这里是把不需要循环右移的字符串赋值到数组b中;b[ ]="defghijk"。\\

    while(a[k]!='\0')

    {

        b[j]=a[k]; j++; k++;

    }                 \\因为上一个while循环中,数组b已经赋值到b[j]了。所以这里直接从b[j]开始把数组a中的字符串全部赋值到数组b[j]以后的空间中;b [ ]="defghijkabcdefghijk";\\

    b[i]='\0';      \\通过用数组a中字符串的长度i来调整数组b的长度,删去数组b中多余的字符串 ,b[]="defghijklabc"。

    for(i=0;b[i]!='\0';i++)

               { a[i]=b[i]; }                  \\把数组b中调整好的字符串重新赋给数组a。\\

    }

    再次我们来解决字符串循环左移的问题

    方法一:调用已经有的字符串函数。

    #include<stdio.h>

    #include<string.h>

    void leftloop(char *a, int n);

    main()

    {

    char a[100];   int n;

    printf("请输入要循环的字符串:\n");

    scanf("%s",a);

    printf("请输入要循环字符串的位数:\n");

    scanf("%d",&n);                                       \\以上代码也可以直接赋初值,我考虑的是一般情况\\

    void leftloop(a,n);                                    \\本例以a[]="abcdefghijk", n=3为例讲解\\

    printf("输出已经循环左移的字符串:%s\n",a);

    }

    void leftloop(char*a,int n)

    {char b[100];      \\数组b要做的够大即可\\

    int m;

    m=strlen(a)-n;              \\求出除去要循环右移之后剩下的字符的个数\\

    strcpy(b,a+m);            \\ a+m,a代表a[0]的地址再加上m,表示要把a[m]之后的字符串(即那些需要循环左移的字符,共有n个)复制到数组b中。这时b[]="ijk"。 \\

    strcpy(b+n,a);                  \\ b+n, 因为上面已经把需要循环的n个字符赋给了b,所以b[n]之前的不能在赋值了,只能把a的全部字符串赋给b[n]之后的空间了。这时b[]="ijkabcdefghijk"。\\

    *(b+strlen(a))='\0';              \\这里是问题的关键,要根据a字符串的长度来舍弃b数组中多余的字符串,并给数组b加结束符。这时b[]="ijkabcdefgh";\\

    strcpy(a,b);                                \\把数组b中调整好的字符串重新赋给数组a。\\

    }

    方法二:就是用简单的c语句;#include<stdio.h>

    void leftloop(char , int )

    main()

    {

    char a[100];   int n;

    printf("请输入要循环的字符串:\n");

    scanf("%s",a);

    printf("请输入要循环字符串的位数:\n");

    scanf("%d",&n);                                        \\以上代码也可以直接赋初值,我考虑的是一般情况\\

    void leftloop(a,n);                                    \\本例以a[]="abcdefghijk", n=3为例讲解\\

    printf("输出已经循环左移的字符串:%s\n",a);

    }

    void leftloop(char a[ ], int n)

    {

           int i=0,j=0,k;

            int m; char b[100];

    while(a[i]!='\0')

            { i++; }     \\这里用i来计算数组a中字符串的大小;\\

    k=m=i-n;          \\计算出前面有多少个字符不用移动\\

    while(a[k]!='\0')

    {

         b[j]=a[k]; j++; k++;

    \\因为这时k=i-m,a[k]表示需要循环移动的第一个字符,这里是把需要循环右移的字符串赋值到数组b中;b[ ]="ijk"。\\

    b[j]='\0';

    m--;k--;     \\因为要用m调节下面的循环但是要从0开始所以比实际的多了一次;k--是为了要留着数组a中的结束符,不出现乱码;\\

    while(m>=0)

    {

        a[k]=a[m]; m--; k--;

    }                  \\ 原来a[k]=“abcdefghijk",a[m]="abcdefgh",赋值之后a[k]="abcabcdefgh";\\

    for(i=0;b[i]!='\0';i++)

               { a[i]=b[i]; }       \\把数组b中调整好的字符串重新赋给数组a。b[i]="ijk";a[i]="abcabcdefgh"。赋值之后a[i]="j\\

    }

  • 相关阅读:
    数据中心相关
    VUE对象方法
    statefulset有状态应用管理
    图片无损放大工具
    BBR vs BBRplus vs BBR2 一般网络速度对比
    AlmaLinux、CentOS、Rocky Linux 8 更新到 Linux 内核
    vuedraggable拖拽生成页面简单Demo
    微服务基础(一)介绍及选择架构
    生成Id
    P6348 [PA2011]Journeys
  • 原文地址:https://www.cnblogs.com/neworiginou/p/2344757.html
Copyright © 2020-2023  润新知