c - C中不区分大小写的排序

原文 标签 c sorting case-sensitive case-insensitive

我有一个.txt文件,我想用C编程对它排序。我有这个对.txt文件进行排序的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_LEN 100 // Length of each line in input file.

int main(void)
{
    char *strFileName = "/home/milad/Desktop/ddd.txt";
    char *strFileSummary = "/home/milad/Desktop/ddd2.txt";
    char strTempData[MAX_LEN];
    char **strData = NULL; // String List
    int i, j;
    int noOfLines = 0;

    FILE * ptrFileLog = NULL;
    FILE * ptrSummary = NULL;

    if ( (ptrFileLog = fopen(strFileName, "r")) == NULL ) {
        fprintf(stderr,"Error: Could not open %s\n",strFileName);
        return 1;
    }
    if ( (ptrSummary = fopen(strFileSummary, "a")) == NULL ) {
        fprintf(stderr,"Error: Could not open %s\n",strFileSummary);
        return 1;
    }

    // Read and store in a string list.
    while(fgets(strTempData, MAX_LEN, ptrFileLog) != NULL) {
        // Remove the trailing newline character
        if(strchr(strTempData,'\n'))
            strTempData[strlen(strTempData)-1] = '\0';
        strData = (char**)realloc(strData, sizeof(char**)*(noOfLines+1));
        strData[noOfLines] = (char*)calloc(MAX_LEN,sizeof(char));
        strcpy(strData[noOfLines], strTempData);
        noOfLines++;
    }
    // Sort the array.
    for(i= 0; i < (noOfLines - 1); ++i) {
        for(j = 0; j < ( noOfLines - i - 1); ++j) {
            if(strcmp(strData[j], strData[j+1]) > 0) {
                strcpy(strTempData, strData[j]);
                strcpy(strData[j], strData[j+1]);
                strcpy(strData[j+1], strTempData);
            }
        }
    }
    // Write it to outfile. file.
    for(i = 0; i < noOfLines; i++)
        fprintf(ptrSummary,"%s\n",strData[i]);
    // free each string
    for(i = 0; i < noOfLines; i++)
        free(strData[i]);
    // free string list.
    free(strData);
    fclose(ptrFileLog);
    fclose(ptrSummary);
    return 0;
} 

这段代码区分大小写,它首先对大写字母进行排序,然后对小写字母进行排序,这不是我想要的。我要它按字母顺序排列字母,对字母大小写不敏感。我知道ASCII码以及为什么会有这个问题,但是我找不到解决它的方法。
如何更改代码使其不区分大小写?

最佳答案

如果您的系统有POSIXstrcasecmp功能可用,请将strcmp替换为strcasecmp以减少替换。
否则,在您自己的代码中实现不区分大小写的字符串比较,并用它替换strcmp的调用。在将两边的字符转换为相同的大小写(大写或小写)后,可以通过逐字符比较字符串来实现所需的功能。
注意1:您的算法效率很低:您以最大长度分配所有字符串,以避免字符串长度不等时出现未定义的行为。您可以按确切的长度分配字符串,并避免未定义的行为,因为您根本不需要复制内容:交换字符串指针将完成这项工作,而且速度要快得多。

if(strcasecmp(strData[j], strData[j+1]) > 0) {
    char *tmp = strData[j];
    strData[j] = strData[j+1];
    strData[j+1] = tmp;
}

注2:气泡排序算法相当慢,除非数组几乎是以排序开始的。对于较大的文件,可以使用qsort显著提高速度。

关于c - C中不区分大小写的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46453481/

相关文章:

c - 在 STM32 中从 RAM 执行代码

java - 根据元素字段对ArrayList进行排序

algorithm - 凸壳算法修正问题

php - SQLite:对特定查询执行区分大小写的LIKE查询

elasticsearch - Elasticsearch-将符号视为常规字符串并使文本不区分大小写

简单类型字符串的 XML 模式不区分大小写枚举

c - 为什么我的函数返回0而不是文件中的行数?

c - 如何确定给定一组具有最小角度的三角形三角形[闭合]

c - 使用 levenshtein 距离生成摘录

python - 按 Pandas 中的第二个项目对元组系列进行排序