C++将string复制到char二维数组时崩溃及编译错误求助
问题原因分析
第(4)行编译错误原因
_board[i]是固定长度的char数组名,属于不可修改的右值,不能直接用=运算符赋值,因此会报「expression must be a modifiable lvalue」错误。
第(3)行运行崩溃原因
崩溃由多个问题共同导致:
- 宏定义错误:你定义
ROW和COL时末尾加了多余的分号,宏展开后会将分号带入数组定义逻辑,实际数组容量不符合预期,访问时容易越界。 strcpy_s参数使用错误:标准安全版本strcpy_s需要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
相关产品推荐
相关产品推荐

