C++员工数组创建函数问题排查:strcpy报错及代码修正请求
解决Visual Studio中strcpy替换为strcpy_s的问题及员工数组实现方案
strcpy_s的用法说明
Visual Studio提示替换strcpy是因为它认为strcpy存在缓冲区溢出风险,strcpy_s是更安全的替代函数,参数格式如下:
errno_t strcpy_s(char* dest, size_t destSize, const char* src);
dest:目标字符串缓冲区destSize:目标缓冲区的总大小(包括末尾的'\0')src:源字符串
返回值为0表示拷贝成功,非0表示出错。
完整可运行代码实现
下面是符合需求的完整代码,包含结构体定义、合法性校验、数组填充和测试逻辑:
#include <iostream> #include <cstring> #include <cctype> // 定义员工结构体 struct Employee { char name[50]; char position[50]; double salary; char gender; }; // 校验姓名/职位是否仅含字母 bool isAlphaOnly(const char* str) { for (int i = 0; str[i] != '\0'; i++) { if (!isalpha(str[i])) { return false; } } return true; } // 创建并填充员工数组 void fillEmployees(Employee* empArr, int n) { for (int i = 0; i < n; i++) { std::cout << "请输入第" << i+1 << "位员工信息:\n"; // 输入姓名并校验 char tempName[50]; do { std::cout << "姓名(仅含字母):"; std::cin >> tempName; if (!isAlphaOnly(tempName)) { std::cout << "姓名格式错误,请重新输入!\n"; } } while (!isAlphaOnly(tempName)); // 使用strcpy_s拷贝姓名 strcpy_s(empArr[i].name, sizeof(empArr[i].name), tempName); // 输入职位并校验 char tempPos[50]; do { std::cout << "职位(仅含字母):"; std::cin >> tempPos; if (!isAlphaOnly(tempPos)) { std::cout << "职位格式错误,请重新输入!\n"; } } while (!isAlphaOnly(tempPos)); strcpy_s(empArr[i].position, sizeof(empArr[i].position), tempPos); // 输入薪资并校验 do { std::cout << "薪资(大于0):"; std::cin >> empArr[i].salary; if (empArr[i].salary <= 0) { std::cout << "薪资必须大于0,请重新输入!\n"; } } while (empArr[i].salary <= 0); // 输入性别并校验 do { std::cout << "性别(M/K):"; std::cin >> empArr[i].gender; empArr[i].gender = toupper(empArr[i].gender); // 统一转为大写 if (empArr[i].gender != 'M' && empArr[i].gender != 'K') { std::cout << "性别格式错误,请输入M或K!\n"; } } while (empArr[i].gender != 'M' && empArr[i].gender != 'K'); std::cout << "\n"; } } // 输出员工列表 void printEmployees(const Employee* empArr, int n) { std::cout << "===== 员工列表 =====\n"; for (int i = 0; i < n; i++) { std::cout << "第" << i+1 << "位员工:\n"; std::cout << "姓名:" << empArr[i].name << "\n"; std::cout << "职位:" << empArr[i].position << "\n"; std::cout << "薪资:" << empArr[i].salary << "\n"; std::cout << "性别:" << empArr[i].gender << "\n\n"; } } int main() { int n; // 输入员工数量并校验 do { std::cout << "请输入员工数量(大于0):"; std::cin >> n; if (n <= 0) { std::cout << "员工数量必须大于0,请重新输入!\n"; } } while (n <= 0); // 动态分配员工数组 Employee* empArr = new Employee[n]; // 填充数组 fillEmployees(empArr, n); // 输出员工列表 printEmployees(empArr, n); // 释放动态内存 delete[] empArr; return 0; }
关键修改点说明
- strcpy_s替换:所有字符串拷贝操作都替换为
strcpy_s,并传入目标缓冲区的大小(通过sizeof获取结构体中字符数组的大小),避免缓冲区溢出风险。 - 合法性校验实现:
- 用
isalpha函数检查姓名和职位的每个字符是否为字母; - 循环输入直到薪资大于0;
- 将性别转为大写后校验是否为'M'或'K'。
- 用
- 动态数组处理:因为员工数量
n是运行时输入的,所以用new动态分配数组,使用完毕后用delete[]释放内存,避免内存泄漏。 - 输入循环逻辑:每个字段都通过
do-while循环确保输入合法后才进行下一步。
内容的提问来源于stack exchange,提问作者Freshu
相关产品推荐
相关产品推荐

