调用bubbleSort函数时如何正确传入char *[]类型的第一个参数
错误原因
你定义的bubbleSort第一个形参char *names[]本质是char **类型,设计目标是接收字符串指针数组(即每个数组元素都是指向独立字符串的指针);但你main函数中定义的names是char[8]类型的单字符数组,每个元素是char类型,传参时会自动退化为char*指针,和形参要求的char**完全不匹配,因此触发类型转换报错。
解决方案
根据你的实际需求选以下任意一种修改方案即可:
方案1:需求为排序单个字符数组(匹配你当前main函数的测试用例)
修改bubbleSort的形参定义和内部交换逻辑即可,修改后完整代码如下:
#include <iostream> #include <string.h> using namespace std; enum Bool { TRUE, FALSE }; // 修改第一个形参为char数组类型 void bubbleSort(char names[], const int size) { Bool swapped; // 交换的变量类型改为char,和数组元素类型匹配 char temp; for (int i = 0; i < size; ++i) { swapped = FALSE; for (int j = 0; j < size - i - 1; ++j) { if (names[j] > names[j + 1]) { temp = names[j]; names[j] = names[j + 1]; names[j + 1] = temp; swapped = TRUE; } } if (swapped == FALSE) { break; } } } int main() { char names[] = {'s', 'a', 'c', 'd', 'i', 'd', 'm', 'o'}; int size = 8; bubbleSort(names, size); for (int i = 0; i < size; ++i) cout << names[i] << " " << endl; return 0; }
方案2:需求为排序多个字符串(匹配你最初设计的bubbleSort函数签名)
修改main函数中的测试用例为字符串指针数组,同时修正bubbleSort内部的字符串比较逻辑(直接比较指针是比地址,不是比字符串字典序,需要用strcmp函数):
#include <iostream> #include <string.h> using namespace std; enum Bool { TRUE, FALSE }; void bubbleSort(char *names[], const int size) { Bool swapped; char* temp; for (int i = 0; i < size; ++i) { swapped = FALSE; for (int j = 0; j < size - i - 1; ++j) { // 用strcmp比较字符串字典序,返回大于0表示前一个字符串更大 if (strcmp(names[j], names[j + 1]) > 0) { temp = names[j]; names[j] = names[j + 1]; names[j + 1] = temp; swapped = TRUE; } } if (swapped == FALSE) { break; } } } int main() { // 定义字符串指针数组,每个元素为char*类型,和形参类型匹配 char* names[] = {"susan", "alice", "bob", "david", "lily", "mike", "john", "tom"}; int size = 8; bubbleSort(names, size); for (int i = 0; i < size; ++i) cout << names[i] << " " << endl; return 0; }
内容的提问来源于stack exchange,提问作者yurachika2020
相关产品推荐
相关产品推荐

