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
相关产品推荐
相关产品推荐

