C++初学者求助:修改传入函数的数组值及加密程序问题
问题分析与修复方案
你的代码存在几个关键错误,导致数组修改不生效、出现随机值,下面逐个说明并修复:
1. 函数传参错误(核心问题)
在main函数中,你传递的是arrEncrypt[size]——这是访问数组的第5个元素(数组下标从0开始,size=4时合法下标为0-3),属于数组越界访问,且传递的是单个整数而非数组地址。正确传参方式是直接传递数组名arrEncrypt,数组名会隐式转换为指向首元素的指针,函数才能修改原数组。
2. 加密与交换的顺序颠倒
作业要求先执行每位数字加7取余,再执行位置交换,但你的代码先调用swap再调用encrypt,顺序完全反了,会导致结果错误。
3. swap函数的逻辑错误
- 你定义了
int box[1] = {0};,该数组仅1个元素,下标只能是0,但你使用了box[1],属于越界访问,会破坏内存产生随机值; - 同时写了循环交换和手动交换,导致交换操作执行两次(比如第一位和第三位交换两次等于没交换);
- 循环逻辑本身冗余,
k < num/2(num=4即k<2)的循环已经完成了需要的交换,后续手动交换完全多余。
修复后的完整代码
main.cpp
#include "encrypt.h" #include <iostream> const size_t size{4}; int main () { int arrEncrypt[size] = {1, 2, 3, 4}; // 先加密再交换,传递数组名 encrypt(arrEncrypt); swap(arrEncrypt); printArr(arrEncrypt); return 0; }
encrypt.h
#ifndef ENCRYPT_H #define ENCRYPT_H void encrypt(int a[]); void swap(int a[]); void printArr(int a[]); #endif
encrypt.cpp
#include <iostream> #include "encrypt.h" const size_t num{4}; // 加密:每位数字加7后取10的余数 void encrypt(int arr[]) { for (int k = 0; k < num; k++) { arr[k] = (arr[k] + 7) % 10; } } // 交换:第一位与第三位、第二位与第四位 void swap(int arr[]) { // 用单个临时变量存储交换值,简洁安全 int temp; temp = arr[0]; arr[0] = arr[2]; arr[2] = temp; temp = arr[1]; arr[1] = arr[3]; arr[3] = temp; } // 输出加密后的整数 void printArr(int arr[]) { for (int k = 0; k < num; k++) { std::cout << arr[k]; } std::cout << std::endl; }
额外说明
- C++中数组作为函数参数时会退化为指针,因此函数内部修改数组元素会直接作用于原数组,前提是传递正确的数组名;
- 数组越界访问是C++常见的未定义行为来源,务必避免;
- 简单交换操作使用单个临时变量比数组更简洁可靠。
内容的提问来源于stack exchange,提问作者Isabella
相关产品推荐
相关产品推荐

