微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

qsort 将数组的所有值都变为空

如何解决qsort 将数组的所有值都变为空

我有一个程序读取文本文件的行并将它们存储在 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));
for (int i = 0; i < size; i++) {
    linesArr[i] = (char*)malloc(255*sizeof(char));
}

它使用文件指针 fp

填充文本中的值
for (int i = 0; i < size; i++) {    
    fgets(line,fp);
    strcpy(linesArr[i],line);
}

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

解决方法

对于初学者来说,这个内存分配

char **linesArr = (char**)malloc(size*sizeof(char));
                                             ^^^^^

不正确,你需要写

char **linesArr = (char**)malloc(size*sizeof(char *));
                                             ^^^^^^

其次,qsort 的调用必须看起来像

qsort(linesArr,size,sizeof( char * ),compFunc);

因为指针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,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;
}

程序输出可能看起来像

Bob
James
Alice
Alice
Bob
James

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。