我正在尝试用 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
但不确定。 :
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
代码中有2个问题:
您将命令行参数从
argv[0]
复制到 argv[argc - 1]
,这是不正确的,因为 argv[0]
是程序的名称,而不是命令行参数。数组中的条目比参数多,并且这个初始条目是 0
,因为程序的名称以字母开头。
您从
i = 1
而不是 i = 0
输出数组,因此您可以在排序后跳过最低的元素。
如果所有参数均为正数,则额外的
0
会排序到最低位置并在输出时跳过,从而隐藏问题,但如果至少有一个负数,则 0
会出现在输出中,并且最低的数字是正如第二个示例中观察到的那样缺失。
两个 bug 相互抵消的典型案例,但并非总是如此。
这是修改后的版本:
#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;
}
}