使用函数对C中的字符串数组进行排序

时间:2013-10-15 21:35:29

标签: c arrays sorting

#include <stdio.h>
#include <string.h>
void bubble_sort_grades(char [], int); 
int main(void)
{
    int menuswitch=1;
    int amountofstudents;
    int i;
    int z;
    char studentinfo[100];
    char fname[50][100];
    char lname[50][100];
    char grade[50][100];
    printf("Enter Amount of Students: ");
    scanf("%d ", &amountofstudents);
    for (i=0;i<amountofstudents;i++)
    {
        fgets(studentinfo, sizeof(studentinfo), stdin);
        strcpy(fname[i], strtok(studentinfo, " "));
        strcpy(lname[i], strtok(NULL, " "));
        strcpy(grade[i], strtok(NULL, " "));
    }
        while (menuswitch==1)
        {
            int answer;
            printf("Enter 1 for Alphabetical Sort (First Name) \n");
            printf("Enter 2 for Alphabetical Sort (Last Name) \n");
            printf("Enter 3 for Score Sort \n");
            printf("Enter 0 to exit \n");
            printf("Enter choice now: ");
            scanf("%d", &answer);
            if (answer==1)
            {
                bubble_sort_grades(grade,amountofstudents);
                printf("%s\n", grade[0]);
                printf("%s\n", grade[1]);
            }
            if (answer==2)
            {
                printf("In 2 \n");
            }
            if (answer==3)
            {
                printf("In 3 \n");
            }
            if (answer==0)
            {
                printf("Ending Program \n");
                menuswitch=0;
            }
        }
}
void bubble_sort_grades(char grades2[], int amount)
{
    int c, d , t;
    for (c=0; c<(amount); c++)
    {
        for (d=0; d<amount-1; d++)
        {
            if (grades2[c]>grades2[d+1])
            {
                t=grades2[d+1];
                grades2[d+1]=grades2[d];
                grades2[d]=t;
            }
        }
    }
}

很抱歉提出其他问题,但我需要有关气泡分类的帮助。我创建了一个函数,用于对输入中的学生成绩进行冒泡。然而,当我这样做时,我只得到排序的第一年级而不是数组。

   Input:
    John Smith 86
    Victor Jones 76

输出: 68 76

3 个答案:

答案 0 :(得分:3)

这里有两个主要问题。

问题1:数组索引不正确

正如@TWhite已经指出的那样,bubble-sort函数的参数类型错误。您已声明您的数组类型为char[50][100],这意味着它将50 * 100个字符分配为内存中的单个大块。如果grade分配了baseAddr的内存,则grade[0]位于baseAddr+0grade[1]位于baseAddr+100grade[2]baseAddr+200等等。如果你没有告诉bubble_sort_grades你的二维数组的最后一个维度,那么就无法计算这些指数。将bubble_sort_grades的签名更改为void bubble_sort_grades(char[][100], int)可以解决该问题。

问题2:您正在存储c字符串,但将它们视为整体

grade数组是一个c字符串数组(char*)。它存储字符,而不是整数。这意味着这一行完全错误:if (grades2[c]>grades2[d+1]) 旁注:请注意,您使用c代替d作为第一个索引,这也是一个错误)。如果你想比较字符串,你应该使用strcmp,因为比较两个char*值将与>运算符进行指针比较。但是,使用strcmp要求所有成绩都是2位数(例如05而不是5),否则字符串"9"将大于"80"。由于成绩是c字符串,这也意味着t=grades2[d+1]完全不正确,因为您将char*存储到int中。您需要创建一个临时缓冲区char t[100],然后使用strcpy而不是通过分配来复制内容。


我喜欢@ chux关于使用struct的建议。使用结构体还具有在使用=运算符时自动(正确)处理复制整个结构的额外好处。我打算提出类似的建议,并且实际上建议使用内置的qsort例程,但我意识到这可能是功课,你可能还没有覆盖结构。在这种情况下,更改grade数组以存储整数而不是c字符串可能更容易。

答案 1 :(得分:2)

许多问题

而不是

char fname[50][100];
char lname[50][100];
char grade[50][100];

使用结构

typedef struct {
  char fname[100];
  char lname[100];
  char grade[100];
} Student_t;
Student_t Student[50];

bubble_sort_grades()内,使用strcmp()来比较名称。

void bubble_sort_grades(Student_t Student[], int amount) {
  int c, d;
  for (c = 0; c < (amount); c++) {
    for (d = 0; d < amount - 1; d++) {
      if (strcmp(Student[d].grade, Student[d+1].grade) > 0) {
        Student_t t;
        t = Student[d];
        Student[d + 1] = Student[d];
        Student[d] = t;
      }
    }
  }
}

还存在其他一些重要问题,但这应该会让OP继续下去。

答案 2 :(得分:1)

一个问题是你的:

void bubble_sort_grades(char [], int); 

应改为:

void bubble_sort_grades(char *[], int); 

考虑对所有数组使用char *[]