命令行插入排序调用reverse后负数变为0的问题求助
问题:带-r参数反转输出时负数变为0
实现命令行参数的插入排序,升序输出正常,但添加-r参数反转输出时,原负数参数变成0。执行示例:
./sort 5 -10 10输出:-10 5 10(正确)./sort -r 5 -10 10输出:10 5 0(错误,原-10变为0)
相关代码
void reverse(double *a, int argc) { for (int i = argc-2; i > 0; --i) { printf("%g\n", a[i]); } } void sort(double *a, int length) { for (int i = 1; i < length; i++) { double key = a[i]; int j = i - 1; while (j >= 0 && a[j] > key) { swap(&a[j+1],&a[j]); j = j-1; } a[j+1] = key; } } void swap(double *x, double *y) { *x = *y; } int main(int argc, char *argv[]) { if (is_valid_num(argv[1]) == 1 || strcmp(argv[1], "-r")== 0) { if (strcmp(argv[1], "-r") == 0) { if (reverseDigitChecker(argc, argv) == 1) { double arr[argc -1]; for (int i = 1; i < argc; i++) { double temp = atof(argv[i]); arr[i-1] = temp; } sort(arr, argc-1); reverse(arr, argc); } } if (strcmp(argv[1], "-r") != 0) { if (digitChecker(argc, argv) == 1) { double arr[argc - 1]; for (int i = 1; i < argc; i++) { double temp = atof(argv[i]); arr[i-1] = temp; } sort(arr,argc-1); for (int j = 0; j < argc-1; j++) { printf("%g\n", arr[j]); } } } } else { printf("%s is an invalid argument.\n", argv[1]); usage(); } return 0; }
问题分析与修复
1. -r参数被错误存入数组
处理-r参数时,代码从i=1开始遍历argv,把argv[1](即-r)通过atof转换为0存入数组。atof遇到非数字字符串会返回0,导致数组多了一个无效的0元素,真正的数字参数应该从i=2开始。
修复:
调整-r分支的循环起始位置,同时修正数组长度:
double arr[argc - 2]; // 去掉程序名和-r参数,数组长度为argc-2 for (int i = 2; i < argc; i++) { double temp = atof(argv[i]); arr[i-2] = temp; } sort(arr, argc-2); reverse(arr, argc-2); // 传递数组实际长度,而非命令行参数总数
2. reverse函数实现错误
当前reverse函数存在两个逻辑问题:
- 参数传递的是命令行参数总数
argc,而非数组实际长度,导致循环范围错误; - 循环条件
i>0跳过了数组第一个元素,无法完整打印所有元素。
修复:
修改reverse函数,接收数组长度作为参数,倒序打印所有元素:
void reverse(double *a, int length) { for (int i = length-1; i >= 0; --i) { printf("%g\n", a[i]); } }
3. swap函数未实现真正交换
当前swap函数仅把*y的值赋给*x,没有完成双向交换。虽然当前sort函数最后通过a[j+1] = key修正了结果,但swap函数本身逻辑错误,后续修改排序逻辑会引发问题。
修复:
实现真正的交换逻辑:
void swap(double *x, double *y) { double temp = *x; *x = *y; *y = temp; }
内容的提问来源于stack exchange,提问作者Jason Fan
相关产品推荐
相关产品推荐

