需求:定義一個字符串數組,隨機選取一個元素賦值給變量。初學者易混淆數組長度計算、隨機數範圍、字符串類型選擇(C 風格 vs std::string)。
auto n[] = {"\xda\x01...", "\xda\x01..."}; // 推導為 const char*[2]
auto key = nullptr;
jstring randomKey(jstring n[]) { // 參數類型錯誤,jstring 是 JNI 類型
srand((unsigned)time((long*)0));
int nlen = rand() % (sizeof(n)/sizeof(n[0])); // 錯誤:參數退化為指針,sizeof 失效
return n[nlen]; // 返回類型不匹配
}
關鍵錯誤:
sizeof(n) 得到指針大小而非數組大小。std::string、JNI 類型 jstring。srand 應只調用一次(程序啟動時),而非每次調用函數時。#include
#include
#include
#include // C++11 隨機庫,優於 rand()
#include
std::string randomKey(const std::vector& arr) {
if (arr.empty()) return "";
static std::mt19937 gen(std::random_device{}()); // 靜態引擎,僅初始化一次
std::uniform_int_distribution dist(0, arr.size() - 1);
return arr[dist(gen)];
}
int main() {
std::vector keys = {
"\xda\x01\x09\xfc\xca\x98\x82\x33\x69\xaa\xc1\xdf\xbb\x40\x90\xcf",
"\xda\x01\x09\xfc\xca\x98\x82\x33\x69\xaa\xc1\xdf\xbb\x40\x90\xcf"
};
std::cout << randomKey(keys) << std::endl;
return 0;
}
#include
#include
#include
const char* randomKeyC(const char* arr[], size_t len) {
if (len == 0) return NULL;
static int seeded = 0;
if (!seeded) { srand((unsigned)time(NULL)); seeded = 1; }
return arr[rand() % len];
}
int main() {
const char* keys[] = {
"\xda\x01\x09\xfc\xca\x98\x82\x33\x69\xaa\xc1\xdf\xbb\x40\x90\xcf",
"\xda\x01\x09\xfc\xca\x98\x82\x33\x69\xaa\xc1\xdf\xbb\x40\x90\xcf"
};
printf("%s\n", randomKeyC(keys, sizeof(keys)/sizeof(keys[0])));
return 0;
}
std::vector:自帶大小、內存安全、支持標準算法。<random> 替代 rand():mt19937 + uniform_int_distribution 質量高、線程安全、無模數偏差。掌握現代 C++ 隨機庫與容器用法,能寫出更安全、高效、可維護的代碼。