【问题标题】:Sorting an Array of Strings in C using functions使用函数对 C 中的字符串数组进行排序
【发布时间】:2013-10-23 20:47:37
【问题描述】:
#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

【问题讨论】:

  • 你期望的输出是什么?
  • 维基百科的文章对冒泡排序有很好的解释。您应该能够使用那里的示例来实现您的。 en.wikipedia.org/wiki/Bubble_sort
  • 我希望它以 76 和 86 的递增顺序排列,而不是仅对数组中的第一个字符串进行排序 (86)
  • 为了构建这个,我不得不将你的一些原型更改为char grade[50][100];。它是为你建造的吗?我认为您这里的代码与您实际使用的代码不匹配。

标签: c arrays sorting


【解决方案1】:

这里有两个主要问题。

问题 1:数组索引不正确

正如@TWhite 已经指出的那样,冒泡排序函数的参数类型错误。您已将数组声明为 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]&gt;grades2[d+1]) (旁注:请注意,您使用c 而不是d 作为第一个索引,这也是一个错误)。如果要比较字符串,则应改用strcmp,因为比较两个char* 值将使用&gt; 运算符进行指针比较。但是,使用strcmp 要求所有成绩都是 2 位数字(例如,05 而不是5),否则字符串"9" 将大于"80"。由于等级是 c 字符串,这也意味着 t=grades2[d+1] 完全不正确,因为您将 char* 存储到 int 中。你需要创建一个临时缓冲区char t[100],然后使用strcpy,而不是通过赋值复制东西。


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

【讨论】:

    【解决方案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 继续下去。

    【讨论】:

    • 这里只是吹毛求疵,但最好记住 _t 类型的后缀是 POSIX 保留的。在这种特殊情况下,这几乎无关紧要,但随意使用 _t 可能会导致以后出现问题。
    • @dreamlax 看起来我应该检查一下。有什么参考建议吗?
    • 参见第 2.2.2 节 here。编辑,更新版本here(同样的限制适用)。
    【解决方案3】:

    一个问题是你的:

    void bubble_sort_grades(char [], int); 
    

    应该改为:

    void bubble_sort_grades(char *[], int); 
    

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

    【讨论】:

    • 也许你的意思是char (*)[100]
    • TWhite:我喜欢你的忍者牛图标——或者我应该说ninnyuu
    猜你喜欢
    • 2013-06-29
    • 2012-08-31
    • 2022-11-20
    • 2013-09-22
    • 2023-02-13
    • 2012-09-13
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    相关资源
    最近更新 更多