qsort 将数组的所有值都变为空
qsort turns all values of array to null
我有一个程序可以读取文本文件的行并将它们存储在 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, 255, 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" ) ] = '[=13=]';
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;
}
程序输出可能看起来像
Bob
James
Alice
Alice
Bob
James
我有一个程序可以读取文本文件的行并将它们存储在 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, 255, 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" ) ] = '[=13=]';
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;
}
程序输出可能看起来像
Bob
James
Alice
Alice
Bob
James