C++编译报错std::string无法转int赋值 学生数据排序问题
编译错误成因
你在代码中定义的临时交换变量pivot被显式声明为int类型,仅支持存储整数类数据。
当执行到pivot= nama[i];、pivot= alamat[i];语句时,你尝试把std::string类型的字符串值赋值给int类型变量,由于两种类型没有兼容的隐式转换规则,编译器直接抛出类型不匹配的报错。
额外隐患:后续用int类型的
pivot交换char类型的golongan_darah数组元素时,虽然不会触发硬报错,但属于不匹配类型的隐式转换,存在数据异常的潜在风险。
修复方案
基础修正(适配原有手写交换逻辑)
删除统一声明的int pivot;变量,在排序交换的逻辑块内,针对不同数据类型的字段,匹配对应类型的临时变量完成交换:
if (NIM[i] > NIM[j]) { // 交换学号(int类型) int tempNim = NIM[i]; NIM[i] = NIM[j]; NIM[j] = tempNim; // 交换姓名(string类型) string tempNama = nama[i]; nama[i] = nama[j]; nama[j] = tempNama; // 交换地址(string类型) string tempAlamat = alamat[i]; alamat[i] = alamat[j]; alamat[j] = tempAlamat; // 交换血型(char类型) char tempBlood = golongan_darah[i]; golongan_darah[i] = golongan_darah[j]; golongan_darah[j] = tempBlood; }
更简洁的工程优化
不需要手动写临时交换变量,直接调用C++标准库提供的std::swap接口,该函数会自动匹配数据类型完成元素交换,从根源上避免类型不匹配问题:
if (NIM[i] > NIM[j]) { swap(NIM[i], NIM[j]); swap(nama[i], nama[j]); swap(alamat[i], alamat[j]); swap(golongan_darah[i], golongan_darah[j]); }
补充体验优化:原有展示输出环节没有加列分隔符,所有字段会挤在同一行无法区分,可以在输出时补充对应的分隔符、宽度设置,让展示效果更清晰。
内容的提问来源于stack exchange,提问作者Ayari
相关产品推荐
相关产品推荐

