將字符串前 k 個字符移至末尾。如 "abcdefgh" 左旋 3 → "defghabc"。採用指針操作實現,含輸入驗證。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
void left_rotate(char *str, int k) {
int len = strlen(str);
if (k >= len || k <= 0) return;
char *start = str;
char *end = str + len;
char *src = str;
// 將前 k 字符移到末尾空間 (假設數組足夠大)
for (int i = 0; i < k; i++) {
*end++ = *start++;
}
// 後段前移覆蓋前段
while (start <= end) { // 注意:end 已移動,實際應用需保存原 end
*src = *start;
start++; src++;
}
}
int main() {
char str[MAX] = "abcdefgh";
int k;
printf("原串:%s\n", str);
printf("輸入左旋位數:");
scanf("%d", &k);
while (k > strlen(str)) {
printf("輸入過大,重新輸入:");
scanf("%d", &k);
}
left_rotate(str, k);
printf("左旋 %d 後:%s\n", k, str);
system("pause");
return 0;
}
while (start <= end) 中 end 已被修改,邊界判斷錯誤MAX=20 可能足夠但不安全k > strlen 很好void left_rotate_safe(char *str, int k) {
int len = strlen(str);
if (k <= 0 || k >= len) return;
// 使用三步反轉法 (無需額外空間)
reverse(str, str + k - 1);
reverse(str + k, str + len - 1);
reverse(str, str + len - 1);
}
// 或使用臨時緩衝區
void left_rotate_temp(char *str, int k) {
int len = strlen(str);
if (k <= 0 || k >= len) return;
char *temp = malloc(k + 1);
strncpy(temp, str, k);
temp[k] = '\0';
memmove(str, str + k, len - k + 1); // 含 \0 移動
strcat(str, temp);
free(temp);
}
原文指針操作思路清晰但邊界處理有缺陷。生產代碼推薦三步反轉法或 memmove+臨時緩衝區,安全高效。