C语言——字符串旋转问题( 二 )


例如arr1 =“abcd”,
将他“加倍”:arr1=“”;此时能找出他所有的翻转情况 。
然后创建三个指针:arr1的头尾指针top1与rear1,arr2的头指针top2;
用指针移动来逐个逐个比较每个字符,初始,三个指针都在各自字符串的第一个字符处,
比较*top1与*top2,直到相等时,top2才会继续移动;
如果*top1==*top2,此时top1不移动了,让rear1和top2继续去移动比较,
如果*rear1一直和*top2相同,那么等rear1-top1==arr2长度时,说明arr2 全部被包含在新的arr1中,也就是说明arr2时arr1旋转后的情况一种;
如果中途碰见一个不相同的字符,那么top1会刷新位置,指向rear1++的位置,然后继续;
代码及详情如下:
//2、优化算法//让原来的字符串再加一个原来的字符串的函数void F(char* arr1) {int len = strlen(arr1);char* top = arr1;char* rear = arr1 + len;for (int i = 0; i < len; i++) {*rear = *top;top++;rear++;}}/*上面这个是我自己写的函数,但是c里面有该功能的库函数strcat或者strncat,两者略有区别,文末有区分*/int is_left_move(char* arr1, char* arr2) {assert(arr1);assert(arr2);/*如果两个字符串长度不相同那肯定不是由旋转过来的*/if (strlen(arr1) != strlen(arr2))return 0;F(arr1);//让原函数“翻倍”或者用strncat(arr1,arr1,strlen(arr1));char* top1 = arr1;//arr1的头指针char* top2 = arr2;//arr2的头指针char* rear1 = arr1;//arr1的尾指针/*当arr2的第一个字符和arr1里的某一个字符相同时,top1就不动了,rear1与top2向后移动当rear1-top1即连续相同字符数等于arr2的长度时,说明arr2是由arr1旋转过来的*/while (top2c语言里也有一个现成的函数可以使用//用strstr函数,文末简单介绍}
关于用到的函数扩展: 1、
断言()作为一种软件调试的方法,提供了一种在代码中进行正确性检查的机制 。
头文件:
语法/原型:void ( int);
主要作用:是对一个表达式进行检查,一个正确运行的程序必须保证这个表达式的值为true,若表达式的值为false,则说明程序已处于一种不正确的状态下,系统需要提供警告信息并且退出程序 。
在我的程序中直接用的(arr1),也可以写成 (arr1!=NULL),因为arr1是个指针,所以得判断下这个指针是否为空 。
2、
() 函数用于对两个字符串进行比较(区分大小写) 。
头文件:.h
语法/原型:int (const char* stri1,const char* str2);

C语言——字符串旋转问题

文章插图
参数 str1 和 str2 是参与比较的两个字符串 。
() 会根据 ASCII 编码依次比较 str1 和 str2 的每一个字符,直到出现不到的字符,或者到达字符串末尾(遇见\0) 。
返回值:
如果返回值 < 0,则表示 str1 小于 str2 。
如果返回值 > 0,则表示 str1 大于str2。
如果返回值 = 0,则表示 str1 等于 str2 。
3、
函数用于把一个字符串加在了前一个字符串的后面 。
原型: char *(char *dest,char *src);
头文件:.h
参数:
例如:char arr1[30] = "";
char arr2[] = "ghi";
如果用了(arr1,arr2);
那么arr1就会变成:"";
但是这个函数不能用来自己追加自己,也就是说禁止自娱自乐:(arr1,arr1);
还有需要注意:arr1一定要有足够的空间来存放arr2的字符串,否则会发生溢出情况 。
4、
函数用于把一个给定长度的字符串加在了前一个字符串的后面 。
原型:char *(char *dest, const char *src,n)
头文件:.h
参数:
例如:char arr1[30] = "";
如果这样用:(arr1,arr1,6);
那么arr1 == ”“;
所以在该程序中可以用这个函数来代替自己的函数 。