根據最佳回答,第四問要求:將字符串打亂(如打亂順序),轉為字符數組,遍歷數組元素,滿足特定編碼規則的字符進行替換,最後將數組拼接還原為字符串。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
// 簡單編碼規則示例:字母後移 1 位(a→b, z→a),數字+1(9→0)
char encodeChar(char c) {
if (c >= 'a' && c <= 'z') return (c == 'z') ? 'a' : c + 1;
if (c >= 'A' && c <= 'Z') return (c == 'Z') ? 'A' : c + 1;
if (c >= '0' && c <= '9') return (c == '9') ? '0' : c + 1;
return c;
}
// 打亂數組(Fisher-Yates 洗牌)
void shuffle(char *arr, int n) {
for (int i = n - 1; i > 0; i--) {
int j = rand() % (i + 1);
char tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}
}
int main() {
srand((unsigned)time(NULL));
char str[] = "HelloWorld123";
int len = strlen(str);
char *arr = malloc(len + 1);
strcpy(arr, str);
// 1. 打亂
shuffle(arr, len);
printf("打亂後: %s\n", arr);
// 2. 遍歷替換
for (int i = 0; i < len; i++) {
arr[i] = encodeChar(arr[i]);
}
printf("編碼後: %s\n", arr);
// 3. 還原順序(若知道打亂種子可逆向,否則不可逆)
// 此處僅演示邏輯,實際加密需保存打亂索引或使用可逆算法
free(arr);
return 0;
}
free。// 結合打亂與編碼,避免額外數組
for (int i = len - 1; i > 0; i--) {
int j = rand() % (i + 1);
// 交換時同步編碼
char tmp = encodeChar(arr[i]);
arr[i] = encodeChar(arr[j]);
arr[j] = tmp;
}