我的问题是创建一个包含三个成员的结构,即日、月和年,并且我们必须通过键盘提供 10 名员工的加入年份。提供的年份应按年份升序显示给用户?
所以我使用了结构数组,然后使用 scanf() 函数提供值,后来我使用冒泡排序对提供的年份进行排序。但我似乎在 scanf() 中遇到问题。我的代码中遇到运行时错误。我的代码有什么错误。请帮忙。
下面是我的代码
#include<stdio.h>
void swap(int *, int *);
int main()
{
int i, j;
typedef struct date
{
char day : 5;
char month : 4;
int year : 12;
}D;
D arr[10];
printf("Enter year of joining of 10 employees\n");
for (i = 0; i < 10; i++)
scanf_s("%d", arr[i].year);
for (i = 0; i < 10; i++)
{
for (j = i + 1; j < 10; j++)
{
if (arr[i].year > arr[j].year)
swap(arr[i].year, arr[j].year);
}
}
printf("Value of employees joining year in sorted order is : \n");
for (i = 0; i < 10; i++)
printf("%d", arr[i].year);
return 0;
}
void swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
最佳答案
两个主要问题是使用位域,以及不传递函数指针。
这里使用位域有一个小要点:无论是位域还是简单整数类型,结构体的大小都是 8。
但实际出现的问题是,在 scanf_s
和 swap
中,您应该将指针传递给位域,并且编译器(MSVC)不喜欢这样。
因此,删除位域规范并向调用添加一个地址运算符。
#include<stdio.h>
typedef struct date
{
char day; // remove bitfield spcs
char month;
int year;
} D;
void swap(int *, int *);
int main(void)
{
int i, j;
D arr[10];
printf("Enter year of joining of 10 employees\n");
for (i = 0; i < 10; i++)
scanf_s("%d", &arr[i].year); // add the & operator
for (i = 0; i < 10; i++)
{
for (j = i + 1; j < 10; j++)
{
if (arr[i].year > arr[j].year)
swap(&arr[i].year, &arr[j].year); // add & operators
}
}
printf("Value of employees joining year in sorted order is : \n");
for (i = 0; i < 10; i++)
printf("%d", arr[i].year);
return 0;
}
void swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
但我想说这仍然是有缺陷的。为什么只交换年份?我建议您也应该交换日期和月份:整个结构
。
关于c - 通过结构数组按排序顺序显示年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40428096/