qsort在输出中给出了奇怪的字符

时间:2019-02-02 15:08:09

标签: c

我想根据姓名对员工数据进行排序。排序功能有效,但在输出中提供了奇怪的字符? 最后一个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之后的那个可以提供奇怪的字符?

1 个答案:

答案 0 :(得分:2)

这个问题最可能的罪魁祸首是您对整个数组进行了排序,即使可能并非所有元素都已初始化。

如果文件包含的数组少于30个元素,则数组的部分将被未初始化并包含不确定的内容(有时看起来是随机的或类似的内容) “垃圾”)。排序时,请勿使用这些数据,而应对从文件中实际读取的数据进行排序。

变量i中的数组中包含有效且已初始化的元素数,应改为使用:

qsort(staff, i, sizeof(employee), struct_cmp_by_name);

打印数据时遇到相同的问题:打印整个数组,包括未初始化的部分。

我建议您为有效元素的数量(合适的名称)创建一个新变量,而不是现在使用的通用i