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

C++并行数组传参报错cannot convert std::string to string* 修复

问题描述

开发带菜单交互的员工列表程序,使用并行数组+自定义函数录入员工姓名、姓氏、工作时长信息时,触发编译错误:

main.cpp:38:28: error: cannot convert ‘std::string’ {aka ‘std::__cxx11::basic_string’} to ‘std::string*’ {aka ‘std::__cxx11::basic_string*’}

问题根因

代码共存在3类问题,编译错误由第一类问题直接触发:

  • 数组传参方式错误:调用getEmpDetails函数时,传入的是name[SIZE]/surname[SIZE]/hoursWorked[SIZE],这是访问数组下标为SIZE的单个元素(本身已经越界,数组有效下标范围是0~SIZE-1),而函数形参要求传入数组(传参时会退化为对应类型指针),类型不匹配直接触发编译报错。
  • 录入逻辑数组越界:getEmpDetails的循环内部,读取输入时全部写入[SIZE]下标位置,既没有使用循环变量x索引当前录入的员工位置,还存在越界写内存的问题,就算编译通过也会出现内存非法访问、数据错乱。
  • 菜单逻辑完全错误:menuDisplay函数中switch分支的case值写为数字0~4,和实际读取的字符型选项('C'/'L'/'A'/'S'/'E')完全不匹配;do-while循环条件写反,会导致输入合法选项直接退出循环,输入非法选项反而跳出循环输出错误提示,逻辑和需求完全相反。
修复后完整代码
#include <iostream>
#include <string>
#include <iomanip>
#include <cctype>
using namespace std;

// 全局常量定义数组长度
const int SIZE = 10;

// 函数前置声明
void menuDisplay();
void getEmpDetails(string[], string[], int[]);

int main()
{
    // 声明并行数组
    string name[SIZE];     // 存储员工名
    string surname[SIZE];  // 存储员工姓
    int hoursWorked[SIZE]; // 存储员工工作时长

    menuDisplay();
    // 修复:直接传数组名(数组首地址),不要带越界下标
    getEmpDetails(name, surname, hoursWorked);

    return 0;
}

void menuDisplay() {
    char choice;

    do {
        cout << "[C]apture Employee details" << endl;
        cout << "[L]ist Employee details" << endl;
        cout << "[A]ll Employee Payslips" << endl;
        cout << "[S]ingle Employee Payslips" << endl;
        cout << "[E]xit" << endl;
        cin >> choice;
        // 统一转大写,兼容小写输入
        choice = toupper(choice);

        switch (choice) {
        // 修复:case匹配实际的字符选项
        case 'C':
            cout << "capture employee detail" << endl;
            break;
        case 'L':
            cout << "list employee details" << endl;
            break;
        case 'A':
            cout << "All Employee Payslips" << endl;
            break;
        case 'S':
            cout << "Single employee payslips" << endl;
            break;
        case 'E':
            cout << "Exit" << endl;
            break;
        default:
            // 修复:非法选项在循环内提示
            cout << "invalid choice, please choose either C,L,A,S,E" << endl;
        }
    // 修复:循环条件为输入不是退出选项E时持续运行
    } while (choice != 'E');
}


void getEmpDetails(string name[SIZE], string surname[SIZE], int hoursWorked[SIZE]) {
    // 遍历数组录入每个员工的信息
    for (int x = 0; x < SIZE; x++) {
        cout << "enter employee name" << endl;
        // 修复:用循环变量x作为下标,避免固定写SIZE导致的越界
        cin >> name[x];
        cout << "enter employee surname" << endl;
        cin >> surname[x];
        cout << "enter number of hours worked" << endl;
        cin >> hoursWorked[x];
    }
}
修复说明
  • 传参时直接写数组名即可,数组名会自动退化为指向数组首元素的指针,匹配函数形参类型,直接解决编译报错。
  • 循环内录入数据时使用循环遍历的下标x访问数组对应位置,既避免越界,也能正确把每个员工的数据存到对应索引位置。
  • 修正菜单分支的匹配值为实际输入的字符,调整循环判断逻辑,输入非法选项时在循环内直接提示,输入E时才退出菜单,同时增加了小写输入兼容处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:39:20