我想根据姓名对员工数据进行排序。排序功能有效,但在输出中提供了奇怪的字符? 最后一个printf语句是我猜到的元凶(代码的底部) 如果有人可以帮助,将不胜感激。 谢谢
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
char name[25];
char firstname[25];
char job;
float hrs;
float rate;
} employee;
int main()
{
FILE *fp = fopen("employee.dat", "r");
employee staff[30];
int i = 0;
if (fp == NULL){
printf("not working\n");
exit(1);
}
fscanf(fp, "%s %s %c %f %f", staff[i].name, staff[i].firstname, &staff[i].job, &staff[i].hrs, &staff[i].rate);
while(!feof(fp))
{
printf("%s %s %c %4.1f %4.1f \n", staff[i].name, staff[i].firstname, staff[i].job, staff[i].hrs, staff[i].rate);
i++;
fscanf(fp, "%s %s %c %f %f", staff[i].name, staff[i].firstname, &staff[i].job, &staff[i].hrs, &staff[i].rate);
}
fclose(fp);
// qsort struct function for comparing names
int struct_cmp_by_name(const void *a, const void *b)
{
employee *ia = (employee *)a;
employee *ib = (employee *)b;
return strcmp(ia->name, ib->name);
}
int structs_len;
structs_len = sizeof(staff) / sizeof(employee);
// sort on names
qsort(staff, structs_len, sizeof(employee), struct_cmp_by_name);
//output with strange charaters???
for(i=0; i<structs_len; i++){
printf("%s %s %c %4.1f %4.1f \n", staff[i].name, staff[i].firstname, staff[i].job, staff[i].hrs, staff[i].rate);
}
return(0);
}
我期望printf语句的常规输出。 第一个printf可以正常工作,但是qsort之后的那个可以提供奇怪的字符?
答案 0 :(得分:2)
这个问题最可能的罪魁祸首是您对整个数组进行了排序,即使可能并非所有元素都已初始化。
如果文件包含的数组少于30个元素,则数组的部分将被未初始化并包含不确定的内容(有时看起来是随机的或类似的内容) “垃圾”)。排序时,请勿使用这些数据,而应对从文件中实际读取的数据进行排序。
变量i
中的数组中包含有效且已初始化的元素数,应改为使用:
qsort(staff, i, sizeof(employee), struct_cmp_by_name);
打印数据时遇到相同的问题:打印整个数组,包括未初始化的部分。
我建议您为有效元素的数量(合适的名称)创建一个新变量,而不是现在使用的通用i
。