我是C的新手,我主要是将C程序迁移/重新实现到Java等。我正在尝试学习C并且我已经完成了几个教程。我有一个程序试图通过char *argv
从命令行读取用户输入(数字),对这些数字进行排序,然后只打印出已排序的数字。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char *argv[])
{
//if the is argument supplied
if (argc > 1)
{
int count = 0;
//array to sort less 1
count = argc -1;
int tobe_sorted[count];
int i=0;
//allocate memory for target result array
int *target = malloc(count * sizeof(int));
//copy unsorted ints to target
memcpy(target, tobe_sorted, count * sizeof(int));
//sort target using bubble sort
int temp =0;
int x =0;
int y=0;
for (x=0; x<count; x++ )
{
for (y=0; y<count -1; y++ )
{
if (target[i]>target[i+1])
{
temp = target[i+1];
target[i+1] = target[i];
target[i] = temp;
}
}//end inner
}//end outer
//end bubble sort
x=0;
printf("Sorted:\n");
//print sorted array
while (x <count)
{
printf("%d",target[x]);
printf(",");
x++;
}
printf("\n");
}//end argument supplied
else{
printf("Error, please enter numbers to be sorted\n");
}
return 0;
}//end main function
PS C:\Users\xyz\workspace_cpp\the_hard_way\ex18> .\sort_test.exe 5 4 3 2 1
Sorted:
2686748 1986196690 32 1 4199492
免责声明:我不打算使用qsort()等库函数,或者提高程序效率。
编辑&amp;基于注释的工作代码(在目标数组中分配了额外的索引,否则排序&amp; char到int转换正在工作):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char *argv[])
{
//if thee is argument supplied
if (argc > 1)
{
int count = 0;
count = argc;
int tobe_sorted[count-1];
//initialize with 0's
int i=0;
for (;i<count; i++)
{
tobe_sorted[i] = 0;
}
//populate tobe_sorted with integer values of argv
i=0;
for (;i<count; i++)
{
tobe_sorted[i] = atoi(argv[i]);
}
//allocate memory for target result array
int *target = malloc((count * sizeof(int)));
//copy unsorted ints to target
memcpy(target, tobe_sorted, count * sizeof(int));
//sort target using bubble sort
int tmp =0;
int x =0;
int y=0;
int swapped = 1;
while (swapped)
{
swapped =0;
y++;
for (x=0; x < count - y; x++)
{
if (target[x] > target[x+1])
{
tmp = target[x];
target[x] = target[x+1];
target[x+1] = tmp;
swapped = 1;
}
}
}
//end bubble sort
x=0;
printf("Sorted:\n");
//print sorted array
while (x <count)
{
printf("%d",target[x]);
printf(",");
x++;
}
printf("\n");
}//end argument supplied
else{
printf("Error, please enter numbers to be sorted\n");
}
return 0;
}//end main function
输入:
PS C:\ Users \ xyz \ workspace_cpp \ the_hard_way \ ex18&gt; 。\ sort_test.exe 5 -3 -2 1 8
输出 排序方式: -3,-2,0,1,5,8,
答案 0 :(得分:3)
您永远不会初始化target
或tobe_sorted
- 他们“充满了垃圾”。
您永远不会从命令行argv
中取出数字并对其执行任何操作。
您需要将argv
中的字符串转换为ints
。像这样:
for(i = 1; i < count; i++) {
tobe_sorted[i-1] = atoi(argv[i]);
}
在memcpy()
答案 1 :(得分:2)
这里的主要问题是您根本没有使用argv
。
您声明了一个名为tobe_sorted
的数组,您没有初始化它的值(因此它包含垃圾)。
然后,您复制target
数组上的数据,然后对该垃圾数据进行排序。然后你打印出来。
您必须解析argv
,使用atoi
等内容将每个参数转换为int
,然后对这些值进行排序。
答案 2 :(得分:2)
你有几个问题:
int tobe_sorted[count];
这是未初始化的。它目前包含垃圾。然后,您将该垃圾复制到目标数组。
//copy unsorted ints to target
memcpy(target, tobe_sorted, count * sizeof(int));
正如1中所述,您的tobe_sorted
数组并不包含您的数据。您想要解析*argv[]
,这是一个包含实际cmdline输入的数组数组。 argc
只是告诉你*argv[]
数组中存在多少个元素。
您需要解析argv
数组,将每个元素转换为int
并将结果存储在tobe_sorted
数组中。