首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言字符串左旋轉:指針操作實現與邊界檢查

     編輯:關於C語言

C語言字符串左旋轉:指針操作實現與邊界檢查

將字符串前 k 個字符移至末尾。如 "abcdefgh" 左旋 3 → "defghabc"。採用指針操作實現,含輸入驗證。

算法思路

    1. 保存前 k 字符到臨時區(或利用數組尾部空間) 2. 將後段字符前移覆蓋前段 3. 將保存的前 k 字符追加到末尾

完整代碼

#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 已被修改,邊界判斷錯誤
  • ⚠️ 假設數組有額外空間存前 k 字符,實際 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+臨時緩衝區,安全高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved