c - 在 C 中对 Unix 环境进行排序

标签 c

我试着整理我的环境。

我的 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 将其比较函数指针传递给要比较的元素;您需要间接指向该指针以获取要传递给 strcmpchar 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/

相关文章:

c++ - 声明和修改结构体静态数组-CPP

c - 防止输入零作为值的第一个数字

c - Quicksort C - 有点不同的版本

c - Visual Studio 2015 C++ - 外部头文件

C - 二维数组向外(从中心开始)顺时针螺旋遍历

c - 为什么程序打印共享对象的全局变量的值错误?

c - 使用 openmp 确保缓冲区访问是私有(private)的

c - 将结构序列化为 CSV 文件

将输入的字符串与打印的函数进行比较

c - "while(*s++ = *t++)"如何复制一个字符串?