一个长度为len的字符串,对其循环右移n位
[期望]
char str[] = "abcdefg";
右移3次后,变成"efgabcd"
[思路]
思路1.
如果用每移动一次,就要把整个字符串整体移动一次的方法,显得太费劲了。
我们可以用空间换时间,通过内存拷贝来实现。
需要新申请一块相同大小的内存,把原字符串的后n个字节拷贝到它的开始地址,把原字符串的前(len-n)个字节拷贝到它的(开始地址+n)处。
为便于查看结果,我们先定义一个打印字符串的函数void print_str(char *str);
void print_str(char *str) { int i,len; if (str == NULL) { return; } len = strlen(str); for(i=0; i<len; i++) { printf("%c",str[i]); } printf(" "); }
思路1的代码实现:
#include <stdio.h> #include <string.h> #include <stdlib.h> void print_str(char *str) { int i,len; if (str == NULL) { return; } len = strlen(str); for(i=0; i<len; i++) { printf("%c",str[i]); } printf(" "); } int str_rshift_1(char *str, int n) { int len; char *tmp; len = strlen(str); if (len < n) { return 1; } tmp = (char *)malloc(len); if (tmp == NULL) { return 1; } memcpy(tmp, str+len-n, n); memcpy(tmp+n, str, len-n); memcpy(str, tmp, len); free(tmp); str[len] = '