【问题标题】:Sorting array using pointers - C programming使用指针对数组进行排序 - C 编程
【发布时间】:2020-10-01 11:18:51
【问题描述】:

我的代码有问题。我正在尝试使用指针对数组进行排序。我遇到的问题是,当程序对数组进行排序时,它不会处理最后一个输入元素。到目前为止,我还不太习惯使用指针。我会很感激一些反馈。这是代码

#include <stdio.h>
#include <stdlib.h>
#define MAX 100

void inputarray(int *arr, int size);
void printarray(int *arr, int size);
void sortascending(int *arr, int size);

int main()
{
int array_size, array[MAX],choice;
    printf("Enter size of array:\n");
    scanf("%d",&array_size);
    array_size -= 1;
    printf("Enter elements:\n");
    inputarray(array, array_size);
    printf("Sorting scending:\n");
    sortascending(array, array_size);

    printarray(array, array_size);

    return 0;
}


void inputarray(int *arr, int size)
{
    int *arrayend = arr + size - 1;
    while(arr <= arrayend)
    {
        scanf("%d\n",arr++);
    }

}

void printarray(int *arr, int size)
{
    int *arrayend = arr + size-1;
    while(arr <= arrayend)
    {
        printf("%d", *(arr++));
    }
}


void sortascending(int *arr, int size)
{
    int *arrayend = arr + size - 1; 
    int i,j,t;
    for(i=0; i< size; i++)
    {
        for(j=i+1; j< size; j++)
        {
            if(*(arr+j)<*(arr+i))
            {
                t = *(arr+i);
                *(arr+i) = *(arr+j);
                *(arr+j) = t;
            }
        }
    }       
}

所以基本上如果我按 9、8、7、6、5 的顺序输入 5 个元素,它将返回 6、7、8、9,忽略最后一个输入元素(即 5)。有什么建议吗?

【问题讨论】:

  • 为什么要从请求的数组大小中减一?
  • printf("%d", *(arr++)); 你先增加指针,然后读取值。
  • 由于某种原因,该程序允许超过请求的输入大小。所以如果我输入 5,它允许我输入 6。
  • 您的程序将使用索引而不是指针算法来简化。例如:arr[i] 而不是 *(arr+i)
  • 如果你从零开始使用'for'循环,你的循环可能会更清晰,更容易处理,

标签: c arrays sorting pointers


【解决方案1】:

我看到在将 array_size 作为输入后,您将其减 1,这是不必要的。这是因为在所有函数中,您正在执行 arrend = arr + size - 1,即您正在执行 arrend = arr[size-1]。当 size 是数组的实际大小时,此方法有效。因此,您无需在 main 函数中递减 array_size。 工作代码:

#include <stdio.h>
#include <stdlib.h>
#define MAX 100

void inputarray(int *arr, int size);
void printarray(int *arr, int size);
void sortascending(int *arr, int size);

int main()
{
int array_size, array[MAX],choice;
printf("Enter size of array:\n");
scanf("%d",&array_size);
//no need to decrement size here
printf("Enter elements:\n");
inputarray(array, array_size);
printf("Sorting scending:\n");
sortascending(array, array_size);

printarray(array, array_size);

return 0;
}


void inputarray(int *arr, int size)
{
    int *arrayend = arr + size - 1;
    while(arr <= arrayend)
    {
        scanf("%d",arr++);
        //remove \n from above line

    }

}

void printarray(int *arr, int size)
{
    int *arrayend = arr + size-1;
    while(arr <= arrayend)
    {
        printf("%d", *(arr++));
    }
}


void sortascending(int *arr, int size)
{
    int *arrayend = arr + size - 1; 
    int i,j,t;
    for(i=0; i< size; i++)
    {
        for(j=i+1; j< size; j++)
        {
            if(*(arr+j)<*(arr+i))
            {
                t = *(arr+i);
                *(arr+i) = *(arr+j);
                *(arr+j) = t;
            }
        }
    }       
}

【讨论】:

  • 是的,它可以工作,但由于某种原因,即使输出具有指定大小,它仍然允许 size + 1 输入。它让我烦恼,但是程序运行良好
  • 终于找到了。你正在做: scanf("%d\n",arr++) 。此行中的 \n 是额外输入的原因。只需执行 scanf("%d",arr++)。 scanf("%d\n",arr++) 最后期待一个非空输入(非换行输入)。这意味着读取数字直到出现非空白字符(忽略数字后的所有空格和'\n')。所以删除它可以解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2017-05-07
  • 2014-05-16
  • 2020-03-15
相关资源
最近更新 更多