今天再看面試題時 出現了一個字符串左右移動循環的問題,看了一遍還沒有弄懂,就發了點時間來看了一下字符數組與字符指針的問題,最終還是得到解決,呵呵,只要肯發功夫,還是會有收獲的
例如:有一組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\\
}