我试着整理我的环境。
我的 C++ 版本(std::sort 行与 CstrLess 类一起)有效,但 qsort 版本失败。我做错了什么?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
extern char** environ;
struct CstrLess{
bool operator()(const char* s1, const char* s2){ return ::strcmp(s1,s2)<0; }
};
int main(){
char** env = environ;
size_t sz = 0;
for(;*env; env++,sz++) {;} //measure the env
//?
qsort(environ, sz, sizeof(char*), (int (*)(const void*, const void*)) strcmp);
/*std::sort(environ, environ + sz, CstrLess{});*/
env = environ;
while(*env){
printf("%s%c", *env++, '\0');
}
return 0;
}
最佳答案
qsort
将其比较函数指针传递给要比较的元素;您需要间接指向该指针以获取要传递给 strcmp
的 char const*
指针:
qsort(environ, sz, sizeof(char*),
[](const void* a, const void* b) {
return strcmp(
*reinterpret_cast<const char**>(a), *reinterpret_cast<const char**>(b)); });
纯 C 解决方案:
int qsort_strcmp(const void* a, const void* b) {
return strcmp(*(const char**)(a), *(const char**)(b));
}
// ...
qsort(environ, sz, sizeof(char*), qsort_strcmp);
关于c - 在 C 中对 Unix 环境进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37001963/