我无法按字母顺序对文件中的“姓氏”进行排序:我得到中止陷阱: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",&amp;(SRecords[nummarks].Marks)) != EOF) 除了 EOF 之外还有其他条件。建议检查积极/成功的条件:while(fscanf(MarksDataFile,"%d",&amp;(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] &gt; array[d+1]) 来处理您的特定数据。

【讨论】:

以上是关于我无法按字母顺序对文件中的“姓氏”进行排序:我得到中止陷阱:6的主要内容,如果未能解决你的问题,请参考以下文章

在mysql中按字母顺序对全名进行排序

在 C++ 中对字符串数组进行排序

C ++:从文本文件中读取单行,按字母顺序对单词进行排序

使用 Twig 按字母顺序排序

按字母顺序对HashMap程序的输出进行排序[重复]

Python数据结构按字母顺序排序列表