字符串数组排序(qsort参数 比较函数)
2012-04-12 20:14
453 查看
这个问题来自一个面试题。
给两个文件,其中一个文件存在一万行左右的文本,将所有数据以行为元素进行排序,输出到文件2中。
拿到这个题,一看数据量大约一万行,内存应该没问题,感觉直接调用库函数qsort,写个cmp函数就
很容易搞定,没想到调试程序发现了一个小问题。
分析程序代码:
const int MAXLINE = 100;
const int MAXLEN = 256;
int mycmp(const void *p1, const void *p2)
{
char* s1 = (char *)p1;
char* s2 = (char *)p2;
cout<<s1<<" "<<s2<<endl;
return strcmp(s1, s2);
}
bool sort_file(char* file1, char* file2)
{
ifstream in(file1);
if(!in)
{
cerr<<"open file1 failed"<<endl;
return false;
}
char word[MAXLINE][MAXLEN];
// char *word[MAXLINE];
cout<<sizeof(word[0])<<endl;
int line_num = 0;
while(!in.eof())
{
/*
char *tmp = new char[MAXLEN];
in.getline(tmp, MAXLEN, '\n');
word[line_num] = tmp;
*/
in.getline(word[line_num], MAXLEN, '\n');
line_num++;
}
ofstream out(file2);
if(!out)
{
cerr<<"open file2 failed"<<endl;
return false;
}
qsort(word, line_num, sizeof(word[0]), mycmp);
int i = 0;
while(i < line_num)
{
cout<<word[i]<<endl;
out<<word[i++]<<'\n';
}
in.close();
out.close();
return true;
}
在这个代码中word为一个二维数组,那么每一个word[i]表示的其实是一个一维数组,我们知道如果使用一个char*来指向它的话,
那么可以直接利用这个char*来代表这个数组,所以在cmp函数中使用的是char*,看下面的例子。
版本二:
int mycmp(const void *p1, const void *p2)
{
char** s1 = (char**)p1;
char** s2 = (char**)p2;
cout<<*s1<<" "<<*s2<<endl;
return strcmp(*s1, *s2);
}
bool sort_file(char* file1, char* file2)
{
ifstream in(file1);
if(!in)
{
cerr<<"open file1 failed"<<endl;
return false;
}
// char word[MAXLINE][MAXLEN];
char *word[MAXLINE];
cout<<sizeof(word[0])<<endl;
int line_num = 0;
while(!in.eof())
{
char *tmp = new char[MAXLEN];
in.getline(tmp, MAXLEN, '\n');
word[line_num] = tmp;
// in.getline(word[line_num], MAXLEN, '\n');
line_num++;
}
ofstream out(file2);
if(!out)
{
cerr<<"open file2 failed"<<endl;
return false;
}
qsort(word, line_num, sizeof(word[0]), mycmp);
int i = 0;
while(i < line_num)
{
cout<<word[i]<<endl;
out<<word[i++]<<'\n';
}
in.close();
out.close();
return true;
}
此时的word表示的是一个指针数组,每个word[i]就是一个char*,那么我们利用qsort的时候传递的是指向这个char* 的指针,即
char**,所以在cmp中需要将void* --> char**,然后用*s来表示char*传递给strcmp。
上面的例子说明,qsort 的比较函数中传递的是数组元素的指针,明白这个就很好理解了。
重复一下qsort 的参数:
给两个文件,其中一个文件存在一万行左右的文本,将所有数据以行为元素进行排序,输出到文件2中。
拿到这个题,一看数据量大约一万行,内存应该没问题,感觉直接调用库函数qsort,写个cmp函数就
很容易搞定,没想到调试程序发现了一个小问题。
分析程序代码:
const int MAXLINE = 100;
const int MAXLEN = 256;
int mycmp(const void *p1, const void *p2)
{
char* s1 = (char *)p1;
char* s2 = (char *)p2;
cout<<s1<<" "<<s2<<endl;
return strcmp(s1, s2);
}
bool sort_file(char* file1, char* file2)
{
ifstream in(file1);
if(!in)
{
cerr<<"open file1 failed"<<endl;
return false;
}
char word[MAXLINE][MAXLEN];
// char *word[MAXLINE];
cout<<sizeof(word[0])<<endl;
int line_num = 0;
while(!in.eof())
{
/*
char *tmp = new char[MAXLEN];
in.getline(tmp, MAXLEN, '\n');
word[line_num] = tmp;
*/
in.getline(word[line_num], MAXLEN, '\n');
line_num++;
}
ofstream out(file2);
if(!out)
{
cerr<<"open file2 failed"<<endl;
return false;
}
qsort(word, line_num, sizeof(word[0]), mycmp);
int i = 0;
while(i < line_num)
{
cout<<word[i]<<endl;
out<<word[i++]<<'\n';
}
in.close();
out.close();
return true;
}
在这个代码中word为一个二维数组,那么每一个word[i]表示的其实是一个一维数组,我们知道如果使用一个char*来指向它的话,
那么可以直接利用这个char*来代表这个数组,所以在cmp函数中使用的是char*,看下面的例子。
版本二:
int mycmp(const void *p1, const void *p2)
{
char** s1 = (char**)p1;
char** s2 = (char**)p2;
cout<<*s1<<" "<<*s2<<endl;
return strcmp(*s1, *s2);
}
bool sort_file(char* file1, char* file2)
{
ifstream in(file1);
if(!in)
{
cerr<<"open file1 failed"<<endl;
return false;
}
// char word[MAXLINE][MAXLEN];
char *word[MAXLINE];
cout<<sizeof(word[0])<<endl;
int line_num = 0;
while(!in.eof())
{
char *tmp = new char[MAXLEN];
in.getline(tmp, MAXLEN, '\n');
word[line_num] = tmp;
// in.getline(word[line_num], MAXLEN, '\n');
line_num++;
}
ofstream out(file2);
if(!out)
{
cerr<<"open file2 failed"<<endl;
return false;
}
qsort(word, line_num, sizeof(word[0]), mycmp);
int i = 0;
while(i < line_num)
{
cout<<word[i]<<endl;
out<<word[i++]<<'\n';
}
in.close();
out.close();
return true;
}
此时的word表示的是一个指针数组,每个word[i]就是一个char*,那么我们利用qsort的时候传递的是指向这个char* 的指针,即
char**,所以在cmp中需要将void* --> char**,然后用*s来表示char*传递给strcmp。
上面的例子说明,qsort 的比较函数中传递的是数组元素的指针,明白这个就很好理解了。
重复一下qsort 的参数:
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) ); base:指向第一个元素的指针,即数组首地址 num:要排序的元素个数,及数组长度 size:数组元素的大小,一般写成sizeof(base[0]) comparator:自己写的比较函数了
相关文章推荐
- 我想用strcmp() 作为比较函数, 调用qsort() 对一个字符串数组排序, 但是不行。
- 字符串数组 函数参数
- 字符串格式参数的日期比较函数
- uva10132 字符串数组的qsort排序技巧
- 通过自定义函数进行字符串或数组进行排序
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- 手写的日期排序 数组作为参数传入排序函数,输出时需要override String类中的 toString
- 鸡啄米:C++编程入门系列之二十六(数组、指针和字符串:数组的存储与初始化、对象数组、数组作为函数参数)
- NSDictionary NSMutableDictionary NSSet 还有数组中字符串比较排序,数组中国数字从大到小排序
- C程序中,strlen是求取字符串长度,若对整形数组,求取的是什么?还有整形数组作函数参数的问题?
- 写一个函数对字符串数组进行排序,排序的规则是根据每个字符串中……
- C/C++ 调用qsort/sort 对字符数组排序的cmp函数写法
- 通过函数调用对字符串数组进行各种排序
- 几个有用小函数(数组去重,数组、字符串排序)
- js中 数组重排序之比较函数
- C++和Java函数传递数组参数比较
- 用qsort对字符串数组排序需要注意的几个问题
- C++指针【数组、字符串作为函数的参数】
- 使用qsort进行字符串数组排序
- Lua学习笔记3. 函数可变参数和运算符、转义字符串、数组