C
文章平均质量分 88
C语言
mrbone11
这个作者很懒,什么都没留下…
展开
-
C-lex yacc入门看这篇就够了
当我们面对一个具有一定语法规则的文本内容,如log文件,CMakeLists.txt,甚至某种编程语言的源文件,希望提取出其中的有用信息时,我们该如何做?最简单的方式就是使用逐字或者逐行读取的方式,根据文本的规则去编写if条件语句,判断是否已经碰到了我们希望读取的内容,如果是则提取信息,否则跳过。对于具有复杂规则的文本,这么做的效率很低,并且不够优雅。我们可以使用lex yacc来帮助我们进行这项工作。lex允许将一个名字(name)和正则表达式关联起来,称之为定义(definition)原创 2023-06-29 22:24:04 · 1626 阅读 · 0 评论 -
C语言-使用evhttp实现多线程服务器
#include<sys/socket.h>#include<stdio.h>#include<pthread.h>#include<unistd.h>#include<stdlib.h>#include<evhttp.h>#include<string.h>#include<err.h>...原创 2020-01-20 16:43:40 · 2604 阅读 · 7 评论 -
C-格式化输出十六进制数据
在网络抓包,需要查看二进制文件内容,内存等信息的时候,经常需要输出其16进制值,有时还希望打印出可打印字符串值,因此用C写了个函数,如下:void hexdump(unsigned char *buf, unsigned int buf_len) { int i, j, mod = buf_len % 16; int n = 16 - mod; for (i = 0; i < b...原创 2020-01-07 18:04:42 · 3548 阅读 · 0 评论 -
cJSON-正确使用防止内存泄漏
主要涉及两个释放内存的函数:cJSON_free和cJSON_Delete,该项目在github上有如下说明:Printing JSONGiven a tree ofcJSONitems, you can print them as a string usingcJSON_Print.char *string = cJSON_Print(json);It will allocate a string and print a JSON representation of the tr...原创 2020-06-01 19:49:38 · 15487 阅读 · 7 评论 -
C-goto语句的使用
goto主要用于函数执行到一定步骤后,跳转到返回成功或失败的代码。那么为什么不能直接返回而需要使用goto呢?就我个人理解,使用goto的好处之一是使代码更加简洁清晰。例如,当函数中有多个地方需要返回成功或失败,而且返回之前可能需要有固定的代码(如释放内存),如果不使用goto语句,意味着需要在每个返回的地方都写上同样的代码,...原创 2020-06-02 19:06:53 · 1144 阅读 · 0 评论 -
C库中结构体的封装方法
当我们编写C语言库时,如果定义了某个结构体,并且库的使用者需要使用到这个结构体,但我们又不希望结构体的结构暴露在外,可以采用如下方式:1.在.c文件中定义结构体2.头文件中使用typedef为这个结构体定义别的名称。这样库的使用者只需使用这个别名,而无需(也无法)知道结构体成员有哪些。上面讲的有点绕,给个示意图。在使用openssl的库的时候可以看到这种用法我们只能定义指向EVP...原创 2020-04-27 18:54:27 · 1581 阅读 · 2 评论 -
C函数返回值的设计
C语言中返回值用来表示函数的执行结果。最简单的返回值设计为:返回0表示成功,返回-1表示失败。进一步,如果有多种错误情况,则返回-1,而具体的错误在全局变量errno中(也可以返回多种负值?);如果函数执行成功,则返回0,若成功时需要返回更有意义的值,则返回不同的正数,如成功读取的字节数。...原创 2020-05-09 17:58:21 · 489 阅读 · 0 评论 -
C-stdout和stderror及fprintf和printf区别
不只是这样,stderr的内容不会缓冲,直接显示在屏幕上,而stdout的内容可能不会及时显示。即使不用fprintf,重定向之后依然能够写入到文本文件中。@Undefined默认情况下,stdout是行缓冲的,这意味着缓冲区将在每行结束('\n')处被刷新。stderr是无障碍的,所以每个角色都会自动发送而不需要刷新。你可以通过\n在stdout输出结尾放置一个来确认。这样两条线都将以1秒的间隔打印。https://zhidao.baidu.com/questi...原创 2020-08-10 19:07:35 · 1352 阅读 · 0 评论 -
C-Linux 内存泄露检测
使用valgrind,执行命令valgrind --tool=memcheck --leak-check=full ./main--leak-check=full可以显示代码中哪里可能出现了错误。原创 2020-09-01 14:37:21 · 130 阅读 · 0 评论 -
C-函数指针
概述之前并没有特别注意函数指针的概念,但其实我们平常编写代码的时候也经常会用到函数指针,因此网上收集了一些资料简单总结了一下,避免用得不明不白。在Linux系统上创建线程会使用到以下函数int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);其中第三个参数就是函数指针,新创原创 2020-08-31 18:46:10 · 121 阅读 · 0 评论 -
C-格式化日志函数实现
程序通常需要记录运行日志表明运行状态,出错时方便定位问题。之前的日志函数实现如下:#include <stdio.h>#include <time.h>void get_date(char *nowtime) { time_t rawtime; struct tm* ltime; time(&rawtime); ltime = localtime(&rawtime); strftime(nowtime, 20, "%Y-%m-%d %H:%M:%原创 2020-09-28 18:13:11 · 602 阅读 · 0 评论 -
C-类函数宏、可变参数宏、#、##
今天在知乎上看到一个有趣的宏定义:#define LOG_INFO(fmt, args...) fprintf(stdout, "%d|"fmt"\n", __LINE__, ##args)一时间竟不知道如何解释这个宏定义 。查阅了相关资料后总算基本了解它的工作原理,让我们一步一步来。一、定义类函数宏参考:1.https://blog.csdn.net/skyflying2012/article/details/384367112.https://...原创 2021-08-04 20:58:31 · 919 阅读 · 0 评论 -
C-VS2019 内存泄漏检测
平常编写C代码时,如果忘记释放已分配的内存,就会造成内存泄漏,这时我们有两种方式确认造成内存泄漏的位置,一种是直接检查代码中所有涉及到内存分配的地方是否最后都进行释放了,这种方法的缺点在于在代码量较大时手工检查工作量较大,另外如果使用第三方库,一方面我们可能对库何时分配了内存不甚了解,另一方面单独检查每个分配内存的函数也较为繁琐。另一种方法是借助 Visual Studio 调试器和 C 运行时 (CRT) 库。使用方法如下参考:https://www.cnblogs.com/xingchen.原创 2020-06-29 18:50:55 · 4914 阅读 · 1 评论