You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:06:24