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

C++将string复制到char二维数组时崩溃及编译错误求助

问题原因分析

第(4)行编译错误原因

_board[i]是固定长度的char数组名,属于不可修改的右值,不能直接用=运算符赋值,因此会报「expression must be a modifiable lvalue」错误。

第(3)行运行崩溃原因

崩溃由多个问题共同导致:

  1. 宏定义错误:你定义ROW和COL时末尾加了多余的分号,宏展开后会将分号带入数组定义逻辑,实际数组容量不符合预期,访问时容易越界。
  2. strcpy_s参数使用错误:标准安全版本strcpy_s需要3个参数,依次为目标缓冲区指针、目标缓冲区最大长度、源字符串指针,你漏传了目标缓冲区长度参数,函数无法判断边界,极易出现缓冲区溢出。
  3. 边界校验缺失:没有判断读取的行数是否超过ROW上限,也没有判断单行长度是否超过COL上限,很容易出现数组越界访问;同时用while(!file.eof())的判断逻辑会多读一次空行,进一步提升越界概率。
实现方案

不需要逐字符循环的复制方法可以直接用strncpy_s,配合边界校验就能实现需求,完整修正后的代码如下:
首先修正宏定义:

// 去掉宏末尾的多余分号
#define ROW 25
#define COL 80

构造函数实现:

#include <iostream>
#include <fstream>
#include <string>
#include <cstring> // 新增头文件,提供字符串操作函数

Board::Board(std::string name)
{
    std::string line;
    std::ifstream file(name);
    int i = 0;
    if (file.is_open())
    {
        // 读行成功且行数不超过上限才继续执行,避免越界
        while (std::getline(file, line) && i < ROW)
        {
            // 参数依次为:目标缓冲区、目标缓冲区最大长度、源字符串、超长自动截断
            strncpy_s(_board[i], COL, line.c_str(), _TRUNCATE);
            i++;
        }
        file.close();
    }
}

内容的提问来源于stack exchange,提问作者thatDude

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:57:03