我无法按字母顺序对文件中的“姓氏”进行排序:我得到中止陷阱:6
Posted
技术标签:
【中文标题】我无法按字母顺序对文件中的“姓氏”进行排序:我得到中止陷阱:6【英文标题】:I am unable to sort the 'last names' in the file by alphabetical order: I get Abort trap: 6 【发布时间】:2017-10-08 08:14:42 【问题描述】:我正在编写一个程序,该程序需要读取两个文件(NamesIDs.txt 和marks.txt),并且需要按原样打印NamesIDs.txt 文件中的记录,并打印按字母顺序排序的相同记录(按姓氏)。我可以做第一部分,但第二部分给出'中止陷阱:6) 这些文件可以在这里找到:
https://drive.google.com/drive/folders/0B2B0-_NdCDikSEVjX3ZYU0tpQTQ?usp=sharing
这是我的代码:
/* This program assumes that
names and IDs data file (location and name) is passed as the first argument
and marks data files is passed as the second argument
*/
#define MAXRECORDS 100
#define MAXNAMELENGTH 15
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Define structure to hold student data
struct StudentRecord
char FirstNames[MAXNAMELENGTH];
char LastNames[MAXNAMELENGTH];
int IDNums;
int Marks;
;
int main(int argc, char * argv[])
struct StudentRecord SRecords[MAXRECORDS];
int numrecords, nummarks, recordnum, r;
char Temp[1];
//Read in Names and ID data
FILE * NamesIDsDataFile;
if((NamesIDsDataFile = fopen(argv[1], "r")) == NULL)
printf("Can't read from file %s\n", argv[1]);
exit(1);
numrecords=0;
while (fscanf(NamesIDsDataFile,"%s%s%d",&(SRecords[numrecords].FirstNames[0]),
&(SRecords[numrecords].LastNames[0]),
&(SRecords[numrecords].IDNums)) != EOF)
numrecords++;
fclose(NamesIDsDataFile);
//Read in marks data
FILE * MarksDataFile;
if((MarksDataFile = fopen(argv[2], "r")) == NULL)
printf("Can't read from file %s\n", argv[2]);
exit(1);
nummarks=0;
while(fscanf(MarksDataFile,"%d",&(SRecords[nummarks].Marks)) != EOF)
nummarks++;
fclose(MarksDataFile);
//Print out data as read in
for(recordnum=0;recordnum<numrecords;recordnum++)
printf("%s %s %d %d\n",SRecords[recordnum].FirstNames,SRecords[recordnum].LastNames,SRecords[recordnum].IDNums, SRecords[recordnum].Marks);
printf("A total of %d records printed.\n",numrecords);
while (recordnum>0)
numrecords=0;
while (SRecords[numrecords].LastNames[0] != EOF )
r= strcmp(SRecords[numrecords].LastNames, SRecords[numrecords+1].LastNames);
if (r>0)
strcpy(Temp, SRecords[numrecords].LastNames);
strcpy(SRecords[numrecords].LastNames, SRecords[numrecords+1].LastNames);
strcpy(SRecords[numrecords+1].LastNames, Temp);
numrecords++;
recordnum--;
printf("\nTHE SORTED NAMES ARE AS FOLLOWS\n");
for(recordnum=0;recordnum<numrecords;recordnum++)
printf("%s %s %d %d\n",SRecords[recordnum].FirstNames,SRecords[recordnum].LastNames,SRecords[recordnum].IDNums, SRecords[recordnum].Marks);
printf("A total of %d records printed.\n",numrecords);
return EXIT_SUCCESS;
非常感谢您的帮助。谢谢!
【问题讨论】:
至少有两个问题:1.)char Temp[1]
-> char Temp[MAXNAMELENGTH]
。 2.) while (SRecords[numrecords].LastNames[0] != EOF)
将无法按预期工作,EOF 未存储在姓氏中。即使是,条件也应为while (SRecords[numrecords+1].LastNames[0] != EOF)
或更好while (SRecords[numrecords+1].LastNames[0] != 0)
您可能想阅读以下内容:How to debug small programs
在没有首先检查 argc
以确保命令行参数确实存在之前,永远不要访问 argv[0]
以外的地方
关于:while(fscanf(MarksDataFile,"%d",&(SRecords[nummarks].Marks)) != EOF)
除了 EOF 之外还有其他条件。建议检查积极/成功的条件:while(fscanf(MarksDataFile,"%d",&(SRecords[nummarks].Marks)) == 1)
关于:printf("Can't read from file %s\n", argv[2]);
显示错误信息时,应该输出到stderr
,而不是stdout
,当错误指示来自系统函数时,也显示相关文本。建议:perror( "fopen failed" );
【参考方案1】:
排序算法不正确。
这是bubble
排序算法的示例。
还有其他种类的排序算法,还有 qsort()
库函数,这些原型在头文件中公开:stdlib.h
。
对于示例代码, 'c' 是本地计数器 'd' 是本地计数器 'n' 是要排序的条目数 'array[]' 是要排序的条目 'swap' 与 'array[]' 中的一个条目具有相同的类型
for (c = 0 ; c < ( n - 1 ); c++)
for (d = 0 ; d < n - c - 1; d++)
if (array[d] > array[d+1]) /* For decreasing order use < */
swap = array[d];
array[d] = array[d+1];
array[d+1] = swap;
您应该能够修改上述内容,或许可以使用strcmp()
代替(array[d] > array[d+1])
来处理您的特定数据。
【讨论】:
以上是关于我无法按字母顺序对文件中的“姓氏”进行排序:我得到中止陷阱:6的主要内容,如果未能解决你的问题,请参考以下文章