gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:50:46 26 4
gpt4 key购买 nike

#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

输出:6876

最佳答案

这里有两个主要问题。

问题一:数组索引不正确

正如@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]>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 字符串可能更容易。

关于c - 使用函数对 C 中的字符串数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19391539/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com