三種方法實現一個函數,可以左旋字符串中的k個字符
阿新 • • 發佈:2019-04-25
[] 指針 字符串 i++ == printf != 一位 def 例如:abcd左旋一個字符得到bcda,abcd左旋兩個字符得到cdab
1.數組下標法
1.數組下標法
#include<stdio.h> #include<string.h> void left_handed(char *str, int k) { int i; int count = 0; char temp; while (count < k) { temp = str[0]; for (i = 0; i < strlen(str)-1; i++) { str[i] = str[i + 1];//所有字符左移一位 } count++; str[strlen(str) - 1] = temp; } } int main() { int k=0; char str[] = "abcdef"; printf("輸入需要左旋多少個字符:\n"); scanf("%d",&k); left_handed(str,k); printf("%s",&str); return 0; }
2.指針法
#include<stdio.h> void left_move(char *str, int k) { while (k--)//相當於k!=0 { char *cur = str;//定義一個指針,存儲字符串首地址 char tmp=*cur; while ((*(cur+1)) != ‘\0‘) { *cur = *(cur + 1);//字符串左移一位 cur++; } *(cur) = tmp; } } int main() { char str[] = "abcd"; int k = 0; printf("請輸入左移位數:\n"); scanf("%d",&k); left_move(str, k); printf("%s",str); return 0; }
3.指針==》逆序法
#include<stdio.h> #include<string.h> void Reverse(char *left, char *right)//逆序函數 { while (left < right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } void left_move(char *str, int k, int len)//左旋函數 { char *left = str; char *right = str+len - 1; if (k<0 || k>len) { printf("不合法!\n"); } else { Reverse(left, str+k-1);//地址,需要逆序的左右位置 Reverse(str+k , right); Reverse(left, right); } } int main() { int k; printf("請輸入左移位數:\n"); scanf("%d",&k); char str[] = "abcd"; int len = strlen(str); left_move(str,k,len); printf("%s",str); return 0; }
三種方法實現一個函數,可以左旋字符串中的k個字符