如何修复插入排序中strcmp函数的「指针未强制转换」错误?
问题:插入排序中strcmp报错“makes pointer from integer without a cast”
我写了一段用插入排序按员工姓名升序排序员工信息的代码,现在碰到strcmp函数报错:strcmp makes pointer from integer without a cast,解决不了,求帮忙。员工信息包含姓名、ID、年龄、薪资,测试数据如下:
Tom 001 25 3000 Sam 002 28 5000 Kat 003 34 3000 Alice 004 45 7000 John 005 48 9000 Rick 006 29 5000 George 007 32 3200 Annie 008 44 5500 Lucas 009 56 4700 Mandy 010 37 7500
排序代码如下:
void InsertionSort(employee array[], int size) { int j; for(int pass = 1; pass < size; pass++) { char temp_name[20]; strcpy(temp_name, array[pass].name); int temp_age; int temp_ID; double temp_salary; //traverse through sorted sublist for (j = pass - 1; strcmp(temp_name, array[j].name < 0) && j>=0; j--) { strcpy(array[j+1].name , array[j].name); //right shifting array[j+1].age = array[j].age; array[j+1].ID = array[j].ID; array[j+1].salary = array[j].salary; } //found the location to insert //copy the temp value to correct location strcpy(array[j+1].name , temp_name); array[j+1].age = temp_age; array[j+1].ID = temp_ID; array[j+1].salary = temp_salary; } }
错误原因
核心问题是for循环的条件判断写错了:strcmp(temp_name, array[j].name < 0)
这里运算优先级搞反了,array[j].name < 0会先执行——把字符数组指针和0比较,得到一个整数(0或1),然后把这个整数传给strcmp的第二个参数。但strcmp要求两个参数都是字符串指针,所以编译器报“把整数转成指针”的错误。
另外还有个隐藏bug:你只复制了temp_name,但temp_age、temp_ID、temp_salary都没初始化,最后赋值的时候会用垃圾数据覆盖,导致员工信息错乱。
修正后的代码
void InsertionSort(employee array[], int size) { int j; for(int pass = 1; pass < size; pass++) { // 直接复制整个员工结构体,比单独复制每个字段更简洁不易错 employee temp = array[pass]; // 修正条件:先判断j>=0防止越界,再用strcmp比较字符串 for (j = pass - 1; j >= 0 && strcmp(temp.name, array[j].name) < 0; j--) { array[j+1] = array[j]; // 整体移位,不用逐个字段复制 } array[j+1] = temp; // 插入到正确位置 } }
关键说明
- 把
j >= 0放在条件前面,避免j变成-1时访问array[j].name导致数组越界 - 直接复制整个
employee结构体,代码更简洁,也避免了单独复制字段时遗漏或出错的问题 - strcmp返回值规则:返回小于0表示第一个字符串比第二个小,符合升序排序的判断逻辑
内容的提问来源于stack exchange,提问作者on_my_puter
相关产品推荐
相关产品推荐

