无法打印整数数组

时间:2015-06-30 23:13:03

标签: c

我是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
  1. 我不确定C打印出来的是这些ASCII代码吗?
  2. 为了打印已排序的int数组,我需要在上面的程序中修复什么?
  3. 免责声明:我不打算使用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,

3 个答案:

答案 0 :(得分:3)

您永远不会初始化targettobe_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)

你有几个问题:

  1. int tobe_sorted[count];
  2. 这是未初始化的。它目前包含垃圾。然后,您将该垃圾复制到目标数组。

    1. //copy unsorted ints to target memcpy(target, tobe_sorted, count * sizeof(int));
    2. 正如1中所述,您的tobe_sorted数组并不包含您的数据。您想要解析*argv[],这是一个包含实际cmdline输入的数组数组。 argc只是告诉你*argv[]数组中存在多少个元素。 您需要解析argv数组,将每个元素转换为int并将结果存储在tobe_sorted数组中。