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\\

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM