实现一个函数,可以左旋字符串中的k个字符。这里用了三种方法,为读者看的清晰,第二种方法的代码做了注释,前两种方法是很常见的;第三种方法是字符串群举法,推荐使用第三种方法。
#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<assert.h>
char *left_shift(char *str,int count)
{
int len = strlen(str);
count = count%len;
assert(str);
while(count--){
int i = 0;
char t = str[0];
for(;i < len - 1;i++){
str[i] = str[i+1];
}
str[i] = t;
}
return str;
}
//void Adjust(char *x,char *y)
//{
// while(x < y){
// char t = *x;
// *x = *y;
// *y = t;
// x++,y--;
// }
//}
//char *left_shift(char *str,int count)
//{
// int len = strlen(str);
// char *p = NULL;
// count = count % len;
// p = str + count - 1;
// assert(str);
// Adjust(str,p);
// Adjust(p+1,str+len-1);
// Adjust(str,str+len-1);
// return str;
//}
char *left_shift(char *str,int count)
{
char *ret = str;
int len = strlen(str);
char *stuff = (char*)malloc(64);
char *p = NULL;
count = count % len;
assert(str);
assert(stuff);
strcpy(stuff,str);
strcat(stuff,str);
p = stuff + count;
strncpy(str,p,len);
/*while(len--){
*str = *p;
str++,p++;
}
*str = '\0';*/
free(stuff);
return ret;
}
int main()
{
char str[] = "1234abcd";
int count = 101;
printf("%s\n",left_shift(str,count));
system("pause");
return 0;
}
判断一个字符串是否为另外一个字符串旋转之后的字符串
#include<stdio.h>
#include<windows.h>
#include<assert.h>
#include<string.h>
int test(char *str,char *dest)
{
char *stuff = (char*)malloc(48);
assert(str);
assert(dest);
assert(stuff);
if(strlen(str) != strlen(dest)){
return -2; //返回 -2 表示连字符串的长度都不相等
}
strcpy(stuff,str);
strcat(stuff,str); //此时 stuff 中能找到左旋和右旋的所有子串
if(strstr(stuff,dest) == NULL){
return -1;
}
else{
return 1;
}
free(stuff);
}
int main()
{
char str[] = "abcdef123456";
char *dest = "cdef123456ab";
printf("%d\n",test(str,dest));
system("pause");
return 0;
}