第一种是先保存字符串第一个字符,然后循环实现。
3 第三种方法是用双倍字符串实现
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void strShift(char *str, int len, int step)
{
assert(str);
assert(len > 0);
step %= len;
int i = 0;
for (; i < step; i++){
char tmp = str[0];
int j = 0;
for (; j < len - 1; j++){
str[j] = str[j + 1];
}
str[j] = tmp;
}
}
int main()
{
int k = 0;
char str[] = "ABCD1234";
int len = strlen(str);
printf("Please Enter: ");
scanf_s("%d", &k);
printf("before: %s\n", str);
strShift(str, len, k);
printf("after: %s\n", str);
system("pause");
return 0;
}
第二种方法是把字符串分为两组分别逆置,再整体逆置。
#include<stdio.h> /*第二种方法*/
#include<stdlib.h>
#include<assert.h>
void swap(char *x, char *y)
{
*x ^= *y;
*y ^= *x;
*x ^= *y;
}
void reserve(char *start, char *end)
{
assert(start);
assert(end);
while (start<end)
{
swap(start, end);
start++;
end--;
}
}
void strShift(char *str, int len, int k)
{
assert(str);
assert(len>0);
k %= len;
char *start = str;
char *middle = str + k - 1;
char *end = str + len - 1;
reserve(start,middle);
reserve(middle + 1, end);
reserve(start,end);
}
int main()
{
int k = 0;
char str[] = "ABCD1234";
int len = strlen(str);
printf("Please Enter: ");
scanf_s("%d", &k);
printf("before: %s\n", str);
strShift(str, len, k);
printf("after: %s\n", str);
system("pause");
return 0;
}3 第三种方法是用双倍字符串实现
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void strShift(char* str, int len, int step)
{
assert(str);
assert(len>0);
step %= len;
char* buf = (char*)malloc(sizeof(char)*len*2+1);
strcpy(buf, str);
strcat(buf, str);
strncpy(str, buf+step, len);
free(buf);
buf = NULL;
}
int main()
{
int k = 0;
char str[] = "ABCD1234";
int len = strlen(str);
printf("Please Enter: ");
scanf_s("%d", &k);
printf("before: %s\n", str);
strShift(str, len, k);
printf("after: %s\n", str);
system("pause");
return 0;
}
本文介绍了三种实现字符串循环移位的方法:逐字符移动、分段逆置和利用双倍字符串。每种方法均通过C语言代码示例进行详细说明。
1184

被折叠的 条评论
为什么被折叠?



