Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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将数组的所有值都转换为null_C_Sorting_Dynamic Memory Allocation_C Strings_Qsort - Fatal编程技术网

C qsort将数组的所有值都转换为null

C qsort将数组的所有值都转换为null,c,sorting,dynamic-memory-allocation,c-strings,qsort,C,Sorting,Dynamic Memory Allocation,C Strings,Qsort,我有一个程序,它读取文本文件的行并将它们存储在linesArr中,我还定义了一个函数compFunc,该函数将两个字符串作为输入,复制它们并将副本转换为小写,然后返回strcmp(copy1,copy2)。我试图使用此函数按字母顺序对linesArr进行排序,排序方式为qsort(linesArr,size,255,compFunc。但是数组中的值从{“Bob”,“James”,“Alice”}变为{(null),(null),(null)} 这就是linesArr的初始化方式 char**li

我有一个程序,它读取文本文件的行并将它们存储在
linesArr
中,我还定义了一个函数
compFunc
,该函数将两个字符串作为输入,复制它们并将副本转换为小写,然后返回
strcmp(copy1,copy2)
。我试图使用此函数按字母顺序对
linesArr
进行排序,排序方式为
qsort(linesArr,size,255,compFunc
。但是数组中的值从
{“Bob”,“James”,“Alice”}
变为
{(null),(null),(null)}

这就是
linesArr
的初始化方式

char**linesArr=(char**)malloc(size*sizeof(char));
对于(int i=0;i
它使用文件指针
fp

for(inti=0;i

为什么qsort要删除数组中的值?

首先,这是内存分配

char **linesArr = (char**)malloc(size*sizeof(char));
                                             ^^^^^
是不正确的,你需要写

char **linesArr = (char**)malloc(size*sizeof(char *));
                                             ^^^^^^
其次,
qsort
的调用必须如下

qsort(linesArr, size, sizeof( char * ), compFunc);
Bob
James
Alice
Alice
Bob
James
因为指针
linesArr
指向的数组是指针数组

这是一个演示程序

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

int compFunc( const void *a, const void *b )
{
    const char *s1 = *( const char ** )a;
    const char *s2 = *( const char ** )b;
    
    while ( *s1 && tolower( ( unsigned char )*s1 ) == tolower( ( unsigned char )*s2 ) )
    {
        ++s1;
        ++s2;
    }
    
    return tolower( ( unsigned char )*s1 ) - tolower( ( unsigned char )*s2 );
}

int main(void) 
{
    enum { size = 3, len = 255 };
    
    char **linesArr = malloc( size * sizeof( char * ) );
    
    for ( size_t i = 0; i < size; i++ )
    {
        linesArr[i] = malloc( len * sizeof( char ) );
    }
    
    char line[len];
    
    for ( size_t i = 0; i < size; i++ )
    {
        fgets( line, sizeof( line ), stdin );
        line[ strcspn( line, "\n" ) ] = '\0';
        strcpy( linesArr[i], line );
    }
    
    qsort( linesArr, size, sizeof( *linesArr ), compFunc );
    
    for ( size_t i = 0; i < size; i++ )
    {
        puts( linesArr[i] );
    }
    
    for ( size_t i = 0; i < size; i++ )
    {
        free( linesArr[i] );
    }
    free( linesArr );
    
    return 0;
}

您不应该强制转换malloc的返回。因为您在第一个malloc中没有分配正确的大小,所以您在代码的其余部分中得到了未定义的行为。
malloc(size*sizeof(char))
应该是
malloc(size*sizeof(char*))<代码> > LeSARARR < /代码>是它应该的大小的1/4或1/8。如果你想比较字符串而不考虑情况,那么就考虑检查你的实现是否提供了。这样做会更有效率,然后为每一个比较做字符串的修改拷贝。或者考虑写你自己的-它不会是这样。坚固的