C++中填充随机字符串的数组无法反向打印的问题排查
问题解答
一、反向打印循环的错误原因与修正
你的反向循环无法正常输出,核心问题是数组越界访问:
- 你定义的
RandString是大小为20的数组,C++中数组索引从0开始,合法索引范围是0到19。 - 但你的反向循环从
i=20开始,RandString[20]属于超出数组边界的内存空间,访问它会触发未定义行为(比如输出乱码、程序崩溃等)。而范围for循环会自动遍历数组的有效元素(0到19),所以能正常打印。
修正后的反向循环代码:
for (int i = 19; i >= 0; i--) { cout << RandString[i] << endl; }
二、数组赋值的实现方法
C++原生数组不支持直接用=运算符完成整体赋值(比如TargetArr = RandString;这种写法是非法的),要把已填充的数组赋值给其他变量,有三种常用方案:
方案1:手动循环逐个赋值
遍历原数组的每个元素,依次赋值给目标数组的对应位置:
string RandString[20]; // 先完成RandString的填充逻辑... string TargetArr[20]; for (int i = 0; i < 20; i++) { TargetArr[i] = RandString[i]; }
方案2:使用std::array替代原生数组
std::array是C++标准库提供的固定大小容器,支持直接赋值操作,用法和原生数组接近但更安全:
#include <array> // 需要包含头文件 int main() { std::array<std::string, 26> Alphabets = {"Hey","How","Are","you","Doing","Today","My","Name", "Is","John","Its","Great","to","finally","meet","you","today", "wow","summer","was","long","school","has","started","now"}; std::array<std::string, 20> RandString; srand(time(NULL)); for (int k = 0; k < 20; k++) { int temp = rand() % 26; RandString[k] = Alphabets[temp]; } // 直接完成数组赋值 std::array<std::string, 20> TargetArr = RandString; }
方案3:使用std::vector动态数组
如果不需要固定数组大小,std::vector更灵活,同样支持直接赋值:
#include <vector> int main() { std::vector<std::string> Alphabets = {"Hey","How","Are","you","Doing","Today","My","Name", "Is","John","Its","Great","to","finally","meet","you","today", "wow","summer","was","long","school","has","started","now"}; std::vector<std::string> RandString(20); srand(time(NULL)); for (int k = 0; k < 20; k++) { int temp = rand() % 26; RandString[k] = Alphabets[temp]; } // 直接完成数组赋值 std::vector<std::string> TargetArr = RandString; }
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

