我正在try 用C语言编写代码,从最小到最大对n个数字进行排序.当所有数字都是正数时,它工作得很好,但当我输入负数时,它在第一个索引处返回0.

以下是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include "mySort.h"

int main(int argc, char *argv[])
{
    int data[100000]; /* Array of ints to sort */
    int nDataItems;
    if (argc > 1) {
        nDataItems = argc;
        for (int i = 0; i < nDataItems; i++)
            data[i] = atoi(argv[i]);
    } else {
        nDataItems = 4;
        data[0] = 10;
        data[1] = 20;
        data[2] = 30;
        data[3] = 40;
    }
     
    mySort(data, nDataItems);

    for (int i = 0; i < nDataItems - 1; i++) {
        if (data[i] > data[i + 1]) {
            printf("Sorting error at index %d \n", nDataItems);
            exit(1);
        }
    }
  
    printf("Printing Array: \n");

    for (int i = 1; i < nDataItems; i++)
        printf("%d \n", data[i]);
    return 0;
}

以下是用于排序的代码:

void mySort(int d[], unsigned int n)
{
    int x, y;
    for (int i = 0; i < n; i++)
    {
         x = i - 1;
         y = d[i];
         while (x >= 0 && d[x] > y) {
             d[x+1] = d[x];
             x--;
        }
        d[x + 1] = y;
    }
}

据我所知,代码接受负数并将其转换为0.我怀疑这是atoi的问题,但不确定.Here is a picture of the terminal when I try testing it.:

C:\Users\danes\Desktop\COE428\lab1›testSort2 2 76 33 11 9
Printing Array
2
9
11
33
76

C:\Users\danes\Desktop\COE428\lab1> testSort2 -5 11 29 15 2
Printing Array
0
2
11
15
29

推荐答案

代码中有两个问题:

  • 您将命令行参数从argv[0]复制到argv[argc - 1],这是不正确的,因为argv[0]是程序的名称,而不是命令行参数.数组中的条目比参数的条目多一条,程序名以字母开头,因此初始条目为0.

  • 您输出的是从i = 1开始的数组,而不是从i = 0开始的数组,因此您可以跳过排序后最低的元素.

如果所有参数都是正数,则额外的0排序到最低位置,并在输出中跳过,隐藏问题,但如果至少有一个负数,则0出现在输出中,最低的数字丢失,如第二个示例中所观察到的.

两个错误相互抵消的典型 case ,但并不总是这样.

以下是修改后的版本:

#include <stdio.h>
#include <stdlib.h>
#include "mySort.h"

int main(int argc, char *argv[])
{
    int data[100000]; /* Array of ints to sort */
    int nDataItems;
    if (argc > 1) {
        nDataItems = argc - 1;
        for (int i = 0; i < nDataItems; i++)
            data[i] = atoi(argv[i + 1]);
    } else {
        nDataItems = 4;
        data[0] = 10;
        data[1] = 20;
        data[2] = 30;
        data[3] = 40;
    }
     
    mySort(data, nDataItems);

    for (int i = 0; i < nDataItems - 1; i++) {
        if (data[i] > data[i + 1]) {
            printf("Sorting error at index %d\n", nDataItems);
            exit(1);
        }
    }
  
    printf("Printing Array:\n");

    for (int i = 0; i < nDataItems; i++)
        printf("%d \n", data[i]);

    return 0;
}

void mySort(int d[], unsigned int n)
{
    // perform insertion sort
    for (int i = 1; i < n; i++) {
         int y = d[i];
         for (int x = i; x > 0 && d[x - 1] > y; x--) {
             d[x] = d[x - 1];
        }
        d[x] = y;
    }
}

C++相关问答推荐

为什么这个select()会阻止?

strftime函数中%s的历史意义是什么?为什么没有记录?

为什么PLT表中没有push指令?

C中的__attributor__((aligned(4),packed))与 struct 的用法

如何一次获取一个字符

无法用C++编译我的单元测试

#If指令中未定义宏?

为什么即使在强制转换时,此代码也会溢出?

为什么STM32G474RE上没有启用RCC PLL

如何创建一个C程序来存储5种动物的名字,并在用户 Select 其中任何一种动物时打印内存地址?

二进制计算器与gmp

错误:包含文件时类型名称未知

C-try 将整数和 struct 数组存储到二进制文件中

如何对现有的双向循环链表进行排序?

C23标准是否向后兼容?

我错误地修复了一个错误,想了解原因

";错误:寄存器的使用无效;当使用-masm=intel;在gcc中,但在AT&;T模式

gdb - 你能找到持有内部 glibc 锁的线程吗?

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

为什么INT_MIN是在c语言的头文件limits.h中定义的(-INT_MAX-1)而不是直接使用-2147483648