我正在尝试制作一个简单的个人 ID 及其姓名排名列表。该列表按 Id 升序排序。
我输入的输入是:
Enter: Id Name (5 time)
9 Ace
5 Bob
6 Cindy
7 Dean
2 Erik
我期望得到的输出是
Sorted id is...
2 Erik
5 Bob
6 Cindy
7 Dean
9 Ace
我目前得到的结果是
Sorted id is...
2 ABCDErik
5 BCDErik
6 CDErik
7 DErik
9 Erik
下面是我目前使用的代码。这是一个冒泡排序函数:
int sorting(int n, int *array)
{
int temp;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < (n - i - 1); j++)
{
if (array[j] > array[j + 1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
还有我的主程序:
int main()
{
int i, j, temp;
int num = 5;
int *id = (int *) malloc(sizeof(int) * 5);
char *name = malloc(sizeof(char) * 10);
printf("Enter: Id Name (5 time) \n");
for (i = 0; i < num; i++)
{
scanf("%d %s", &id[i], &name[i]);
}
sorting(num, id);
printf("Sorted id is...\n");
for (i = 0; i < num; i++)
{
printf("%d \t %s \n", id[i], &name[i]);
}
free(id);
free(name);
return 0;
}
有没有办法使正确的名称与其 ID“链接”起来?
最佳答案
您的数据存储方式有误。当您为了在其中存储字符串而分配内存时,您必须根据字符串长度正确计算内存大小。
还有一个char *
是指向一个字符串的指针,字符串数组应该变成char * []
。
#define STRINGCOUNT 20
#define STRINGLEN 100
int maxlen= ... calculated somehow
int stringcnt= ... calculated somehow
char *stringarray[STRINGCOUNT];
for (i=0; i<STRINGCOUNT; i++)
stringarray[i] = malloc(maxlen);
另一种方法是静态分配数据:
char stringarray[STRINGCOUNT][STRINGLEN]
第三种方法是动态分配所有内容。请注意,对于字符串指针数组和动态分配,每个字符串都可以分配不同的长度。
char **stringarray=calloc(stringcnt,sizeof(char *));
for (i=0; i<stringcnt; i++)
stringarray[i] = malloc(maxlen);
// or
stringarray[i] = strdup(somestring);
此外,您还必须记住,C 字符串以 0 字符结尾,因此要存储 Bob,您至少需要 4 个字节。
您目前所做的是分配 10 个字节的缓冲区,并将所有从不同位置开始的字符串放在那里。
关于链接数据,C
语言中的概念称为struct
。在您的情况下,定义将是
struct {
int rank;
char *name;
} items;
结构也可以静态或动态分配,但你必须知道名称元素是一个指向字符串的指针,如果没有显式初始化它不会指向分配的内存并且不能使用。
关于c - 如何对C中输出的正确名称排序列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21641607/