Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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语言中不区分大小写的排序_C_Sorting_Case Sensitive_Case Insensitive - Fatal编程技术网

C语言中不区分大小写的排序

C语言中不区分大小写的排序,c,sorting,case-sensitive,case-insensitive,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"

我有一个.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;
} 
#包括
#包括
#包括
#定义输入文件中每行的最大长度100//。
内部主(空)
{
char*strFileName=“/home/milad/Desktop/ddd.txt”;
char*strFileSummary=“/home/milad/Desktop/ddd2.txt”;
字符strTempData[MAX_LEN];
char**strData=NULL;//字符串列表
int i,j;
int noOfLines=0;
文件*ptrFileLog=NULL;
文件*ptrSummary=NULL;
if((ptrFileLog=fopen(strFileName,“r”))==NULL){
fprintf(strderr,“错误:无法打开%s\n”,strFileName);
返回1;
}
if((ptrSummary=fopen(strFileSummary,“a”))==NULL){
fprintf(strderr,“错误:无法打开%s\n”,strFileSummary);
返回1;
}
//读取并存储在字符串列表中。
while(fgets(strTempData,MAX_LEN,ptrFileLog)!=NULL){
//删除尾随的换行符
if(strchr(strTempData,'\n'))
strempdata[strlen(strempdata)-1]='\0';
strData=(char**)realloc(strData,sizeof(char**)*(noOfLines+1));
strData[noOfLines]=(char*)calloc(MAX_LEN,sizeof(char));
strcpy(strData[noOfLines],strTempData);
努弗林斯++;
}
//对数组进行排序。
对于(i=0;i<(noOfLines-1);+i){
对于(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);
}
}
}
//将其写入outfile.file。
对于(i=0;i
这段代码区分大小写,它首先对大写字母进行排序,然后对小写字母进行排序,这不是我想要的。我希望它能按字母顺序对字母进行排序,并且对字母大小写不敏感。我知道ASCII码以及我为什么会遇到这个问题,但我找不到解决方法

如何更改代码以使其不区分大小写?

如果您的系统具有POSIX功能,请将
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:气泡排序算法非常慢,除非数组一开始就几乎被排序。对于较大的文件,您可以通过使用大大提高速度。

如果您的系统有POSIX功能可用,请将
strcmp
替换为
stracecmp
,以方便替换

否则,在您自己的代码中实现不区分大小写的字符串比较,并用它替换对strcmp的调用。在将字符串两侧的字符转换为同一大小写(大写或小写)后,可以通过逐个字符比较字符串来实现所需的功能

注意1:您的算法效率低下:您以最大长度分配所有字符串,以避免字符串长度不等时出现未定义的行为。您可以按精确的长度分配字符串并避免未定义的行为,因为您根本不需要复制内容:交换字符串指针就可以完成这项工作,而且速度会快得多

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

注意2:气泡排序算法非常慢,除非数组一开始就几乎被排序。对于较大的文件,可以通过使用大大提高速度。

MSVC具有不区分大小写的
strncmp
不确定是否为标准文件。旁白:排序指针而不是指针指向的数据可能更有效。在这种情况下,您不必担心字符串长度。使用
strcasecmp
而不是
strcmp
。您是否考虑过使用
qsort
而不是自己滚动?MSVC具有不区分大小写的
strncmp
不确定是否为标准。旁白:排序指针而不是指针指向的数据可能更有效。在这种情况下,您不必担心字符串长度。使用
strcasecmp
而不是
strcmp
。您是否考虑过使用
qsort
而不是滚动自己的字符串?很好。另一个显著的性能增强可能是通过将多个分配组合成一个来减少对
calloc
的调用数量,尽管这可能超出了这个问题的范围。
qsort()
是一个好方法,但可能会松脱。OP的代码显示稳定,但速度较慢。未知这对OP是否重要。我想如果您选择一个没有稳定排序的标准库,
qsort
可能会对稳定性排序。这超出了这个问题的范围,尽管选择标准库仍然是一种选择,就像选择稳定的排序函数一样,就像重新发明不必要的轮子一样-删除
qsort()
是个好主意,但确实会影响OP的排序功能。
qsort()
的稳定性是未指定的行为。选择依赖于
qsort()
作为稳定的,并使用提供它的C库,会降低代码的可移植性。波塔布