对于我的一个作业,我需要编写一个代码,该代码从文本文件中获取输入,该文本文件在顶行有多个TA,后面的每行包含Name,Day,start hours的值和结束时间。
现在我有了读取文件的函数和以我需要的方式打印输出的函数但是每当我包含我编写的sort函数时,程序都会崩溃。
我使用sort函数做了什么我在嵌套的forloops中使用了strcmp(),以循环遍历数组并确定哪些值按字母顺序取代另一个。然后我使用strcpy()和temp结构来存储一个值,用另一个值交换一个值,然后将另一个值与temp结构中的存储值交换。
我认为probelm可能与我使用strcpy()结构的方式有关,因为我认为它的工作方式是我调用地址而不是实际值,我可能需要使用指针但我不完全确定。这是给我带来麻烦的功能:
void sort_data(struct Shift shift_data[],int num_shifts)
{
int x,y;
for(x = 0 ; x < num_shifts ; x++)
{
for(y = 0; y < num_shifts ; y++)
{
if(strcmp(shift_data[x].name,shift_data[y].name)<0)
{
strcpy(temp.name, shift_data[x].name);
strcpy(shift_data[y].name, shift_data[x].name);
strcpy(shift_data[y].name, temp.name);
}
if(strcmp(shift_data[x].name,shift_data[y].name)<0)
{
strcpy(temp.day_of_week, shift_data[x].day_of_week);
strcpy(shift_data[y].day_of_week, shift_data[x].day_of_week);
strcpy(shift_data[y].day_of_week, temp.day_of_week);
}
if(strcmp(shift_data[x].name,shift_data[y].name)<0)
{
strcpy(temp.start_hour, shift_data[x].start_hour);
strcpy(shift_data[y].start_hour, shift_data[x].start_hour);
strcpy(shift_data[y].start_hour, temp.start_hour);
}
if(strcmp(shift_data[x].name,shift_data[y].name)<0)
{
strcpy(temp.end_hour, shift_data[x].end_hour);
strcpy(shift_data[x].end_hour, shift_data[y].end_hour);
strcpy(shift_data[y].end_hour, temp.end_hour);
}
}
}
}
这是完整的代码:
// Henry Moench
// 12/2/15
// COP3223C-15FALL 0002
// Homework 7
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//initializing structures
struct Shift
{
char name[100];
char day_of_week[100];
int start_hour;
int end_hour;
};
struct Shift shift_data[100];
struct Shift temp;
int main()
{
//initializing variable and calling functions
int num_shifts;
num_shifts= read_data(shift_data);
sort_data(shift_data, num_shifts);
print_data(shift_data, num_shifts);
return 0;
}
//creating function that reads the text file indicated by the user
//and then storing the data into a structure array
int read_data(struct Shift shift_data[])
{
char input[100];
int x;
int num_shifts;
printf("What is the name of the file? ");
scanf("%s", &input);
FILE *ifp;
ifp = fopen(input, "r");
fscanf(ifp, "%d", &num_shifts);
for(x = 0 ; x < num_shifts; x++)
{
fscanf(ifp, "%s", &shift_data[x].name);
fscanf(ifp, "%s", &shift_data[x].day_of_week);
fscanf(ifp, "%d", &shift_data[x].start_hour);
fscanf(ifp, "%d", &shift_data[x].end_hour);
}
fclose(ifp);
return num_shifts;
}
//creates function that prints out the output in the format specified
void print_data(struct Shift shift[], int num_shifts)
{
int x;
printf("TA Shifts \n");
printf("================================================ \n");
for(x = 0; x < num_shifts; x++)
{
printf(" %s",shift_data[x].name);
printf(" %s",shift_data[x].day_of_week);
if(shift_data[x].start_hour>12)
{
shift_data[x].start_hour=shift_data[x].start_hour-12;
printf("%2d:00 pm to ", shift_data[x].start_hour);
}
else if(shift_data[x].start_hour<12)
{
printf("%2d:00 am to ", shift_data[x].start_hour);
}
else if(shift_data[x].start_hour==12)
{
printf("%2d:00 pm to ", shift_data[x].start_hour);
}
if(shift_data[x].end_hour>12)
{
shift_data[x].end_hour=shift_data[x].end_hour-12;
printf("%2d:00 pm\n", shift_data[x].end_hour);
}
else if(shift_data[x].end_hour<12)
{
printf("%2d:00 am\n", shift_data[x].end_hour);
}
else if(shift_data[x].end_hour==12)
{
printf("%2d:00 pm\n", shift_data[x].end_hour);
}
}
}
void sort_data(struct Shift shift_data[],int num_shifts)
{
int x,y;
for(x = 0 ; x < num_shifts ; x++)
{
for(y = 0; y < num_shifts ; y++)
{
if(strcmp(shift_data[x].name,shift_data[y].name)<0)
{
strcpy(temp.name, shift_data[x].name);
strcpy(shift_data[y].name, shift_data[x].name);
strcpy(shift_data[y].name, temp.name);
}
if(strcmp(shift_data[x].name,shift_data[y].name)<0)
{
strcpy(temp.day_of_week, shift_data[x].day_of_week);
strcpy(shift_data[y].day_of_week, shift_data[x].day_of_week);
strcpy(shift_data[y].day_of_week, temp.day_of_week);
}
if(strcmp(shift_data[x].name,shift_data[y].name)<0)
{
strcpy(temp.start_hour, shift_data[x].start_hour);
strcpy(shift_data[y].start_hour, shift_data[x].start_hour);
strcpy(shift_data[y].start_hour, temp.start_hour);
}
if(strcmp(shift_data[x].name,shift_data[y].name)<0)
{
strcpy(temp.end_hour, shift_data[x].end_hour);
strcpy(shift_data[x].end_hour, shift_data[y].end_hour);
strcpy(shift_data[y].end_hour, temp.end_hour);
}
}
}
}
答案 0 :(得分:0)
崩溃可能发生,因为你试图在int字段上使用strcpy(),它将无法工作(阅读strcpy()函数的描述以找出原因)。
我建议您在排序时以不同方式管理数据。
不要对结构数组进行排序,而是将数组保持为索引值数组。
因此,您可以使用现有的相同数组读取原始数据。
但是你只对那个数组的索引值排序一个数组。
int tmp[sizeof(shift_data)] ;
int i = 0 ;
for( i = 0 ; i < sizeof(tmp) ; i++ )
tmp[i] = i ;
现在,当您想要交换数组的元素k和j时,您只需执行以下操作:
int m ;
m = tmp[j] ;
tmp[j] = tmp[k] ;
tmp[k] = m ;
这比你的strcpy()更快 。
与姓名比较
int res ;
res = strcmp( shift_data[ tmp[j] ].name, shift_data[ tmp[k] ].name ) ;
请注意,在您的代码中,您执行以下操作:
if ( A.n < B.n )
swap( A.n, B.n ) ;
if ( A.n < B.n )
swap( A.x, B.x ) ;
但是如果你需要交换,因为A.n&lt; B.n开头,然后第二次比较将给第一个不同的结果,因为你交换了n个字段。这会混淆您的数据。
您应该将所有交换操作包含在单个if()语句中。如果你使用我描述的索引数组方法,你不需要做任何事情,只需比较。
对最终阵列进行排序后,可以使用
按顺序打印int i = 0 ;
for( i = 0 ; i < sizeof(tmp) ; i++ )
{
printf( "name is %s\n", shift_data[ tmp[i] ].name ) ;
}
如果需要,您可以在排序后移动shift_data元素。
最后你应该看看不同的排序算法。