博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串循环移位
阅读量:7127 次
发布时间:2019-06-28

本文共 4487 字,大约阅读时间需要 14 分钟。

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

  例如:有一组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+na代表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+ma代表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-ma[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中调整好的字符串重新赋给数组ab[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 
2 #include
3 #include
4 5 void reserve(char *p, char *q) 6 { 7 while(p < q) 8 { 9 *p ^= *q; //利用异或运算得到两字符交换 10 *q ^= *p; 11 *p ^= *q; 12 p++; 13 q--; 14 } 15 } 16 void loopMove(char *str, int steps) 17 { 18 char *p = str; 19 int len = strlen(str); 20 char *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 32 int main() 33 { 34 char string[] = "123456789"; 35 int 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 43 return 0; 44 }

 

 

转载地址:http://znhel.baihongyu.com/

你可能感兴趣的文章
正则表达式抓取网页中的邮箱地址
查看>>
关于在主进程返回;线程陷入死循环
查看>>
Java必须了解的“递归”与“IO流”!!!
查看>>
Http协议状态码
查看>>
css3单冒号和双冒号的区别
查看>>
小X与缩写
查看>>
第一次团队会议
查看>>
018-请你说一下设计测试用例的方法
查看>>
android 链接mysql数据库
查看>>
CAKeyframeAnimation 旋转动画
查看>>
学习python的第二天
查看>>
Python 基础语法
查看>>
(转)被忽略的Main函数
查看>>
配置spring文件时候出现的小问题
查看>>
微服务系统中的认证策略
查看>>
Java EE
查看>>
Python验证码识别处理实例(转)
查看>>
easyui插件显示问题
查看>>
Flask学习【第3篇】:蓝图、基于DBUtils实现数据库连接池、上下文管理等
查看>>
asp.net core1.1的PlatformAbstraction源码
查看>>