Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C qsort在输出中提供奇怪的字符_C - Fatal编程技术网

C qsort在输出中提供奇怪的字符

C qsort在输出中提供奇怪的字符,c,C,我想根据姓名对员工数据进行排序。排序功能可以工作,但在输出中提供奇怪的字符?? 最后一个printf语句就是罪魁祸首(代码的底部) 如果有人能帮忙,我们将不胜感激。 谢谢 #包括 #包括 #包括 类型定义结构 { 字符名[25]; char firstname[25]; 煤焦作业; 浮动小时数; 浮动汇率; }员工; int main() { 文件*fp=fopen(“employee.dat”,“r”); 员工[30]; int i=0; 如果(fp==NULL){ printf(“不工作”)

我想根据姓名对员工数据进行排序。排序功能可以工作,但在输出中提供奇怪的字符?? 最后一个printf语句就是罪魁祸首(代码的底部) 如果有人能帮忙,我们将不胜感激。 谢谢

#包括
#包括
#包括
类型定义结构
{
字符名[25];
char firstname[25];
煤焦作业;
浮动小时数;
浮动汇率;
}员工;
int main()
{
文件*fp=fopen(“employee.dat”,“r”);
员工[30];
int i=0;
如果(fp==NULL){
printf(“不工作”);
出口(1);
}
fscanf(fp,“%s%s%c%f%f”,职员[i]。姓名,职员[i]。名,&职员[i]。职务,&职员[i]。工时,&职员[i]。费率);
而(!feof(fp))
{
printf(“%s%s%c%4.1f%4.1f\n”,职员[i]。姓名,职员[i]。名字,职员[i]。职务,职员[i]。人事,职员[i]。费率);
i++;
fscanf(fp,“%s%s%c%f%f”,职员[i]。姓名,职员[i]。名,&职员[i]。职务,&职员[i]。工时,&职员[i]。费率);
}
fclose(fp);
//用于比较名称的qsort结构函数
int struct\u cmp\u by\u name(const void*a,const void*b)
{
雇员*ia=(雇员*)a;
雇员*ib=(雇员*)b;
返回strcmp(ia->name,ib->name);
}
int structs_len;
structs_len=sizeof(staff)/sizeof(employee);
//按姓名排序
qsort(员工、结构、规模(员工)、结构(按名称);
//输出带有奇怪字符???

对于(i=0;i而言,问题最可能的罪魁祸首是对整个数组进行排序,即使不是所有元素都已初始化

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

在变量
i
中有数组中有效和初始化的元素数,您应该使用该变量:

qsort(staff, i, sizeof(employee), struct_cmp_by_name);
打印数据时也会遇到同样的问题:打印整个数组,包括未初始化的部分


我建议您为有效元素的数量创建一个新的变量,适当命名,而不是您现在使用的泛型
I

问题最可能的原因是您对整个数组进行排序,即使可能不是所有元素都已初始化

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

在变量
i
中有数组中有效和初始化的元素数,您应该使用该变量:

qsort(staff, i, sizeof(employee), struct_cmp_by_name);
打印数据时也会遇到同样的问题:打印整个数组,包括未初始化的部分


我建议您为有效元素的数量创建一个新的变量,适当命名,而不是您现在使用的泛型
I

请花一些时间阅读,您使用的是什么编译器允许嵌套函数?这不是标准C的一部分。您为30个
employee
结构留出空间,并对整个数组,但你真的输入了那么多吗?你的输入阶段允许你停在更少的位置。编译器是QT Creator,我输入的更少…15对于这个例子,请花一些时间阅读,你使用的是什么编译器允许嵌套函数?这不是标准C的一部分。你允许30个
员工
结构的空间d对整个数组进行排序并打印,但您是否实际输入了那么多?您的输入阶段允许您在更少的位置停止。编译器是QT Creator,或者我输入的更少…15对于本例来说是投票,但不确定!=似乎是随机的。前者可能以这种方式显示,但期待这样的显示是不安全的。我们对就在这之前,ala“我的变量是未初始化的,为什么我打印它时总是得到0?”和“我可以将未初始化的变量用作廉价的随机数吗?”@JohnBollinger重新措辞。谢谢。投票结果是向上的,但不确定!=似乎是随机的。前者可能会以这种方式显示,但期待这样的显示是不安全的。我们以前就有过关于这件事的问题,比如“我的变量未初始化,为什么我打印它时总是得到0?”以及“我可以用一个未初始化的变量作为一个便宜的随机数吗?”@JohnBollinger重新措辞。谢谢。