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

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;
}

关键修改点说明

  1. strcpy_s替换:所有字符串拷贝操作都替换为strcpy_s,并传入目标缓冲区的大小(通过sizeof获取结构体中字符数组的大小),避免缓冲区溢出风险。
  2. 合法性校验实现:
    • 用isalpha函数检查姓名和职位的每个字符是否为字母;
    • 循环输入直到薪资大于0;
    • 将性别转为大写后校验是否为'M'或'K'。
  3. 动态数组处理:因为员工数量n是运行时输入的,所以用new动态分配数组,使用完毕后用delete[]释放内存,避免内存泄漏。
  4. 输入循环逻辑:每个字段都通过do-while循环确保输入合法后才进行下一步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:06:34