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

使用函数对C中的字符串数组进行排序,c,arrays,sorting,C,Arrays,Sorting,输出: 68 76许多问题 而不是 Input: John Smith 86 Victor Jones 76 使用结构 char fname[50][100]; char lname[50][100]; char grade[50][100]; 在bubble\u sort\u grades()中,使用strcmp()比较名称 typedef struct { char fname[100]; char lname[100]; char grade[100]

输出: 68 76许多问题

而不是

   Input:
    John Smith 86
    Victor Jones 76
使用结构

char fname[50][100];
char lname[50][100];
char grade[50][100];
bubble\u sort\u grades()
中,使用
strcmp()
比较名称

typedef struct {
  char fname[100];
  char lname[100];
  char grade[100];
} Student_t;
Student_t Student[50];
void bubble\u sort\u分数(学生[],整数金额){
int c,d;
对于(c=0;c<(金额);c++){
对于(d=0;d0){
学生;;
t=学生[d];
学生[d+1]=学生[d];
学生[d]=t;
}
}
}
}
还有其他一些重要的问题,但这应该会让OP继续下去。

有很多问题

而不是

   Input:
    John Smith 86
    Victor Jones 76
使用结构

char fname[50][100];
char lname[50][100];
char grade[50][100];
bubble\u sort\u grades()
中,使用
strcmp()
比较名称

typedef struct {
  char fname[100];
  char lname[100];
  char grade[100];
} Student_t;
Student_t Student[50];
void bubble\u sort\u分数(学生[],整数金额){
int c,d;
对于(c=0;c<(金额);c++){
对于(d=0;d0){
学生;;
t=学生[d];
学生[d+1]=学生[d];
学生[d]=t;
}
}
}
}
还有其他一些重要的问题,但这应该会让OP继续下去。

一个问题是您的:

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;
      }
    }
  }
}
应改为:

void bubble_sort_grades(char [], int); 
考虑对所有阵列使用
char*[]

一个问题是:

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;
      }
    }
  }
}
应改为:

void bubble_sort_grades(char [], int); 

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

这里有两个主要问题

问题1:数组索引不正确

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

问题2:您正在存储c字符串,但将其视为int

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
中。您需要创建一个临时缓冲区
chart[100]
,然后使用
strcpy
而不是通过赋值复制内容



我喜欢@chux关于使用
结构的建议。当您使用
=
操作符时,使用structs还具有自动(正确)处理复制整个struct的附加好处。我本来打算提出类似的建议,实际上建议使用内置的
qsort
例程,但我意识到这可能是个家庭作业,您可能还没有介绍过structs。在这种情况下,只需将
grade
数组更改为存储int而不是c字符串可能会更容易

问题1:数组索引不正确

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

问题2:您正在存储c字符串,但将其视为int

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
中。您需要创建一个临时缓冲区
chart[100]
,然后使用
strcpy
而不是通过赋值复制内容