开发用户定义的函数,以非递减顺序对数组进行排序

问题描述 投票:0回答:2

我刚刚学习了指针,并在教科书上试了一下这个程序,

“声明一个大小为8的char类型的数组,要求用户输入一个字符串,然后分配给数组。开发一个用户定义的函数,以非递减的顺序对数组进行排序。在排序之前和之后打印数组主要功能。函数原型给出void arr_sort( char * cPtr)

我不清楚我犯了什么错误。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print(char *a[]);
void arr_sort( char *a[]);
int main()
{
    int i;
    char *array[8];
    printf("Please input a string with size 7:");
    for(i=0;i<7;i++)
    {
     scanf("%s",array);
    }
    printf("the array before sorting is");
    print(array);
    arr_sort(array);
    print(array);
    return 0;
}

void arr_sort( char *a[])
{
    int i,j;
    char *temp;
    for(i=0;i<7;i++)
    {
        for(j=0;j<7;j++)
        {
            if(strcmp(a[j],a[j+1])>0)
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
}
void print(char *a[])
{
    int i;
    for(i=0;i<7;i++)
    {
        printf("%s ",a[i]);
    }
}
c
2个回答
0
投票

在C中快速“谷歌”进行冒泡排序会导致:

// where 'n' is the number of entries in the array
// where 'array' is declared as 'int array[n];
for ( int c = 0 ; c < ( n - 1 ); c++ )
{
    for ( int d = 0 ; d < n - c - 1; d++ )
    {
        if ( array[d] > array[d+1] ) /* For decreasing order use < */
        {
            int temp   = array[d];
            array[d]   = array[d+1];
            array[d+1] = temp;
        }
    }
}

注意索引变量上限的限制。

在你的程序中,你将使用char而不是int用于temparray[]的声明

请注意,string.h头文件中不需要任何内容​​。

注意限制局部变量cdtemp的范围

您发布的问题的评论涵盖了发布代码中的问题,因此我不会在此重复所有问题。


0
投票
for(i=0;i<7;i++) {
  scanf("%s",array);
}

如果你想要8个长度为7的字符串,则不能将它们扫描到数组中。您的数组是一个指针数组,如下所示:

char *array[8];

这与此非常不同:

char array[8];

第一个是存储8个字符串指针的数组。第二个是存储8个字符的数组。如果你想存储一个字符串,你会这样做:

char array[8];
printf("Please input a string with size 7: ");
scanf("%s", array);

这可能是你现在习惯的。

因此,一个指针数组就像一个指向内存块的小箭头列表。您的数组本身不存储任何字符,这就是您无法直接扫描到它的原因。

int main(void) {
  char *arr[8];
  char new_word[8];

  for(int i = 0; i < 8; i++) {
    printf("Enter a new word of length 7: ");
    scanf("%s", new_word);
    arr[i] = malloc(strlen(new_word) + 1);
    strcpy(arr[i], new_word);
  }
  for(int i = 0; i < 8; i++) {
    printf("%s\n", arr[i]);
  }

  return 0;
}

该程序创建两个数组:指针数组(arr)和字符数组(new_word)。在循环中,您要求七个长度为7的字符串,这些字符串将扫描到字符数组中。使用malloc为该字符串留出新内存。然后,将字符串复制到第一个数组指针指向的内存块中。我们使用for循环增加数组索引,以便现在我们使用下一个指针,依此类推。

每次使用strcpy并将字符串复制出字符数组非常重要,否则最后,您将只有一个指向单个字符串new_word的指针数组。

© www.soinside.com 2019 - 2024. All rights reserved.