You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

命令行插入排序调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:10:37