资源描述:
《字符串循环右移n位.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、c语言输入一个字符串循环右移n个得到一个新的字符串2011-5-1522:25提问者:匿名
2、浏览次数:880次老师布置了一道题编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“hellow“如果n=2,移位后应该是“owhell”我偷了小懒用下面的方法实现了但是当n=4程序的h就输入不出来了那为高手帮忙解释下谢谢了#include#includevoidLoopMove(char*s,intn){char*s1;intt1=strlen(s);intt=strlen(s)-n;chars2[]={0};s1=s
3、+t;printf("%d",t);strcpy(s2,s1);strncpy(s2+n,s,t);strcpy(s,s2);}intmain(){intn=4;chars[]="hello";char*p=NULL;LoopMove(s,n);printf("%s",s);}谢谢!我来帮他解答2011-5-1522:50满意回答有问题找代码:chars2[]={0};这里相当于s2是1个字符的数组。当对它做类似strcpy(s2,s1);的操作时,只要s1的长度(这里是n)大于1,就会出现数组访问越界。对于像数组访问越界这种错误会引发的结果是不确定性,有可能程
4、序正常运行,也可能会崩溃,取决于越界之后访问到的内存地址的相关属性。将s2改一个动态数组,程序就能正常运行。代码如下:#include#include#includevoidLoopMove(char*s,intn){char*s1;intt1=strlen(s);intt=strlen(s)-n;char*s2=(char*)malloc((t1+1)*sizeof(char));//分配t1+1个字符的空间,之所以加1是因为C中字符串默认以' '结尾,strlen的结果是没包含这个' '的。memset(
5、s2,0,t1+1);//清空s2的内容s1=s+t;printf("%d",t);strcpy(s2,s1);strncpy(s2+n,s,t);strcpy(s,s2);free(s2);//释放资源}intmain(){intn=4;chars[]="hello";char*p=NULL;LoopMove(s,n);printf("%s",s);}在一次面试题中曾遇到过一个题目是使字符串循环移动指定的位数!下面和大家讨论几点有关的算法!#include#include#includevoidstrR
6、ightMove(char**a,intbit){intlen=strlen(*a);if(bit%=len){char*str=(char*)malloc(len+1);strncpy(str,(*a+len-bit),bit);str[bit]=' ';strncat(str,*a,len-bit);*a=str;}}intmain(){char*a="1234567890";strRightMove(&a,5);puts(a);return0;}当然还有其他方法#include"string.h"#include"stdlib.h"voidright_shift
7、(char*dest,intshift){char*temp=NULL;intlen=0;intactual=0;inti=0;intsub=0;if(shift<0){printf("Errornumber");return;}if(dest==NULL
8、
9、*dest==' '){printf("Error:Nullstring");}len=strlen(dest);actual=shift%len;if(actual==0)return;temp=(char*)malloc(sizeof(char)*(len+1));for(i=actual;i10、;++i){temp[i]=dest[i-actual];}sub=len-actual;for(i=0;i