2016-11-04 30 views
-1

我的问题是要包含三个成员即天,月,年的结构,我们必须提供通过键盘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; 

    } 
+0

尝试'scanf_s( “%d”,ARR [I] - >年)' –

+0

scanf()的需要一个指针,所以写&ARR [I] .year。 PS:不要使用scanf_s()和'friends'。 –

回答

0

的两个主要问题是使用位域,而不是传递函数指针。

有使用此位域利特尔点:结构大小为8不论是位字段或简单的整数类型。

但是,在实际的问题出现,是在scanf_sswap你应该到指针传递给位域,编译器(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; 
} 

但我想说这仍然是不足之处。为什么只交换一年?我建议你应该在交换日和月太:整个struct