字符串循环移位
再看⾯试题时出现了⼀个字符串左右移动循环的问题,看了⼀遍还没有弄懂,就发了点时间来看了⼀下字符数组与字符指针的问题,最终还是得到解决,呵呵,只要肯发功夫,还是会有收获的
例如:有⼀组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为例讲解\\
请输入长度介于05之间的字符串
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\\ }
1、字符串循环右移---交换的⽅法
解法:根据题意,编写的函数能把字符串循环右移n位。例如字符串“abcdefghi”,如果n=2,移位后是“hiabcdefg”。(1)先翻转前段“gfedcba hi”,
(2)再翻转后段“gfedcba ih”
(3)最后翻转整个“hi abcdefg”,得到想要的结果。
下⾯是c语⾔的指针操作代码
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5void reserve(char *p, char *q)
6 {
7while(p < q)
8    {
9        *p ^= *q;  //利⽤异或运算得到两字符交换
10        *q ^= *p;
11        *p ^= *q;
12        p++;
13        q--;
14    }
15 }
16void loopMove(char *str, int steps)
17 {
18char *p = str;
19int len = strlen(str);
20char *q = p + len - 1 - steps;
21//printf("%s\n", q);
22
23    reserve(p, q);  //先翻转前⼀段
24    p = q + 1;
25    q = str + len - 1;
26    reserve(p, q);  //翻转后⼀段
27    p = str;
28    reserve(p, q);  //翻转整个字符串
29//printf("%s\n", str);
30 }
31
32int main()
33 {
34char string[] = "123456789";
35int steps = 0;
36
37    printf("string: %s\n", string);
38    printf("input step: ");
39    scanf("%d", &steps);
40    loopMove(string, steps);
41    printf("after loopMove %d: %s\n", steps, string);
42
43return0;
44 }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。