关于C中的qsort(),** buf和buf[][]的区别

2023-12-02

当我在 Mac 上的 C 语言中使用 qsort() 时,这些代码运行良好,它可以很好地对一个文件中的每一行进行排序。

int compare(const void *p, const void *q) {
    return strcmp(p,q);
}

void function_name(){
        char buf[1024][1024];
        int i=0;
        FILE * fp;
        if(!(fp=fopen(filename,"r"))){
            perror("Open error!");
            exit(0);
        }
        while(fgets(buf[i],1024,fp)){
            //printf("%s",buf[i]);
            i++;
        }
        qsort(buf, i, sizeof(buf[0]), compare);
    }

但是,当我使用 malloc 分配空间时,它很糟糕。这是为什么? 下面的代码显示我使用 malloc 来创建一个二维数组。我打印了buf前后的内容。似乎丢失了所有信息。

    int i=0;
    FILE * fp;
    char ** buf;
    buf = (char **)malloc(sizeof(char*)*1024);
    if(!(fp=fopen(filename,"r"))){
        perror("Open error!");
        exit(0);
    }
    buf[0]=(char *)malloc(sizeof(char)*1024);
    while(fgets(buf[i],1024,fp)){
        i++;
        buf[i]=(char *)malloc(sizeof(char)*1024);
    }
    for(int j=0;j<i;j++){
        printf("%s",buf[j]);
    }
    printf("hehe%ld\n",sizeof(char)*1024);

    qsort(buf, i, sizeof(char)*1024, compare);

    printf("hehe\n");
    for(int j=0;j<i;j++){
        printf("%s",buf[j]);
    }

output:

a
A
b
c
d
D
C

E
e
B
d
e
f
a
hehe1024
hehe
(null)(null)(null)(null)(null)(null)(null)(null)(null)(null)(null)(null)(null)(null)(null)(null)

最重要的是,如何修复我的 malloc 版本?


当您尝试qsort buf声明为char **buf,您使用了错误的比较函数。正如我在评论中指出的那样,char buf[x][y] is an x字符数组的数组y chars, e.g. char (*)[y]当作为参数传递时。当你声明buf as char **buf;,你声明一个指向 char 类型指针的指针。无论哪种情况,你都有一个指向字符串的指针,并且您必须取消引用传递给的每个值qsort额外一层间接,例如

int cmpstrings (const void *a, const void *b) {
    return strcmp (*(char * const *)a, *(char * const *)b);
}

一个简短的例子使用char **buf;将会:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* qsort string comparison - for pointer to pointer to char */
int cmpstrings (const void *a, const void *b) {
    return strcmp (*(char * const *)a, *(char * const *)b);
}

int main (void) {

    char *ap[] = { "This is a tale",
                    "of captian Jack Sparrow",
                    "a pirate so brave",
                    "on the seven seas." },
        **buf = NULL;
    int n = sizeof ap/sizeof *ap;    

    if (!(buf = malloc (n * sizeof *buf))) { /* allocate pointers */
        fprintf (stderr, "error: virtual memory exhausted.\n");
        return 1;
    }

    for (int i = 0; i < n; i++)
        buf[i] = strdup (ap[i]);    /* allocate/copy strings */

    qsort (buf, n, sizeof *buf, cmpstrings);

    for (int i = 0; i < n; i++) {   /* print and free */
        printf ("buf[%d] : %s\n", i, buf[i]);
        free (buf[i]);
    }
    free (buf);

    return 0;
}

Example

$ ./bin/qsortptp
buf[0] : This is a tale
buf[1] : a pirate so brave
buf[2] : of captian Jack Sparrow
buf[3] : on the seven seas.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于C中的qsort(),** buf和buf[][]的区别 的相关文章

  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 如何解决 git-remote-https 的权限被拒绝错误?

    我在尝试使用以下命令克隆 GitHub 存储库时遇到问题 git clone https email protected MYPROJECT git 当我运行它时 我收到此错误 fatal cannot exec git remote ht
  • 在 iOS 上调试 Cordova (PhoneGap) 代码

    我正在开发一个应用程序 我想通过 Cordova PhoneGap 在 iOS 中托管 当我尝试访问 device platform 和 device version 属性时遇到了一些问题 我不确定问题是什么 不管怎样 我不知道如何查看代码
  • 通过网页关闭计算机

    我有一个基于网络的应用程序 它会在由 Windows 7 驱动的客户端计算机上的 chromium Web 浏览器中自动加载到信息亭模式 全屏 我想在网页上放置一个关机按钮 以便用户可以直接关闭计算机 有没有可能实现这一目标 最好的解决方案
  • 使用 PHP 提取 CAB 文件

    在 IIS 6 上运行 PHP 如何打开并提取 CAB 文件的内容 有没有什么方法可以在不使用 exec 的情况下做到这一点 我没有权限用 exec 运行东西 无需外部工具 例如赤霞珠提取物这是行不通的 PHP 没有这方面的函数
  • 从 Linux 连接到 Neo4j 的问题

    尝试从 java 连接到 Neo4j 时出现以下错误 线程 main 中的异常 java lang RuntimeException 启动时出错 org neo4j kernel EmbeddedGraphDatabase data gra
  • 通过azure函数删除CosmosDB中的文档

    阅读 Azure 门户后 我了解了如何制作POST PUT and GET通过 Azure Functions 与 CosmosDB 进行操作 但是删除 我不明白该怎么做 我应该使用哪些绑定 它应该通过 sql 查询还是集合的方法 如Rem
  • 部署 jsp/servlet Web 应用程序时出现 Jboss 错误“com.sun.faces.config.ConfigureListener”错误

    我正在研究 JSP Servlet 该 Web 应用程序将部署在 Jboss 6 上 我正在使用 Java 1 6 Eclipse 和 Maven2 我没有在代码中的任何地方引用 JSF 我的项目在任何地方都没有涉及 JSF 但是当我尝试部
  • 有人可以向我解释以下代码吗?

    我正在阅读 Rails 3 in Action 一书 它正在讨论覆盖to s在模型中 代码如下 def to s email admin Admin User end 我知道在 Ruby 中你可以通过以下方式在双引号内显示 一个值 valu
  • JavaScript 中返回多个值?

    我试图返回两个值JavaScript 这可能吗 var newCodes function var dCodes fg codecsCodes rs var dCodes2 fg codecsCodes2 rs return dCodes
  • 安装 ruby​​ 1.9.3 时出错

    我正在尝试使用 rvm 安装 Ruby 1 9 3 但是 当我输入 rvm install 1 9 3 我收到以下错误 ERROR Error running make please read Users nick rvm log ruby
  • ThreeJS:3D 对象面积计算(三角测量)

    我需要在 ThreeJS 中计算整个对象的面积 表面积 这就是我所拥有的 var len object geometry faces length area 0 0 if len return 0 0 for var i 0 i lt le
  • Jackson注释中的多态性:@JsonTypeInfo用法

    我想知道是否 JsonTypeInfo注解可以用于接口 我有一组应该序列化和反序列化的类 这就是我正在尝试做的事情 我有两个实现类Sub1 Sub2实施MyInt 一些模型类具有实现类型的接口引用 我想基于多态性反序列化对象 JsonTyp
  • 在 Flash 中播放 MIDI 文件

    有没有办法在Flash中播放MIDI文件 使用动作脚本 3 None
  • 眼睛空间坐标到底是什么?

    当我学习 OpenGL 时 我经常偶然发现所谓的眼空间坐标 如果我是对的 你通常有三个矩阵 模型矩阵 视图矩阵和投影矩阵 虽然我不完全确定其背后的数学原理是如何工作的 但我确实知道将坐标转换为世界空间 视图空间和屏幕空间 但是眼睛空间在哪里
  • Git 提交消息:50/72 格式

    Tim Pope 在他的博文中主张采用特定的 Git 提交消息样式 http www tpope net node 106 以下是他的建议的快速摘要 第一行不超过 50 个字符 然后是一个空行 剩余文本应以 72 个字符换行 他的博客文章给
  • QFile 打开文件写入失败

    我正在尝试打开文件并向其中写入一些文本数据 QFile out test txt if out open QIODevice ReadWrite QMessageBox msgBox msgBox setText out errorStri
  • Python virtualenv 问题

    我在 Windows XP 上使用 VirtualEnv 我想知道我的大脑是否正确地围绕它 I ran virtualenv ENV它创造了C WINDOWS system32 ENV 然后我改变了我的PATH要包含的变量C WINDOWS
  • 矩阵的块对角绑定

    R 是否具有将矩阵绑定为块对角形状的基函数 以下可以完成这项工作 但我想知道是否有标准方法 a lt matrix 1 6 2 3 b lt matrix 7 10 2 2 rbind cbind a matrix 0 nrow nrow
  • 复制包含索引的表

    有没有办法在 SQL Server 中复制表 不仅仅是像这样的数据SELECT INTO还可以索引 也许还有键 如果我走脚本表为 gt 创建到它遗漏了我的索引 如果此功能不可用 为什么不呢 我确信这个问题肯定被问了 1000 次 但我找不到
  • 关于C中的qsort(),** buf和buf[][]的区别

    当我在 Mac 上的 C 语言中使用 qsort 时 这些代码运行良好 它可以很好地对一个文件中的每一行进行排序 int compare const void p const void q return strcmp p q void fu