![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C 语言note
文章平均质量分 91
叨陪鲤
哈
展开
-
命令行解析函数:getopt_long、getopt
一、前言在学习一些项目代码时,尤其涉及到命令行传参的代码,经常遇到getopt相关的函数,对这一类函数可以说是既陌生又熟悉。陌生是因为不知道它是干啥的,熟悉呢,是因为经常遇到。于是乎在追踪了多天ipsec配置文件解析流程之后,准备学习下这一类命令行解析利器。这么多命令行参数,需要解析,想象都让人头大,如果再没有一个好的解析方式,那就雪上加霜了。辛亏有了一类命令行解析函数,可以让这些解析操作变得容易一点点。下面就简单的介绍下这一类函数,主要有getopt、getopt_long、getopt_l...原创 2021-01-30 22:39:35 · 4663 阅读 · 0 评论 -
记一次《C语言踩内存》问题定位有感
踩内存问题,个人认为算是比较容易出现但是有很难定位的问题,被踩者轻者功能瘫痪,重者一命呜呼,直接诱发死机。产生踩内存的的原因也比较多样,比较典型的有如下几种: 数组越界访问 字符串越界操作 直接操作野指针 操作了一块已经被释放了内存这几种问题,单独说起来都是比较容易发现问题,但这些问题往往在某些环境中不会出现,但是在另外的环境下几乎是必现问题,这时定位起来难度就便增加了很多。这种情况往往是基本逻辑没有问题,在某些环境下(多核、异步、其他复杂环境等)逻辑上出现错误导致出现踩内存的问题。下面我.原创 2020-10-24 16:22:14 · 6172 阅读 · 3 评论 -
字符串比较
字符串比较之初级程序员和高级程序员1. 问题的引入这个话题的来源是这样的:开发过程中不可避免的用到了字符串比较的操作,按理说这个并不复杂,因为有现成的接口可以使用(strcmp, strncmp, memcmp等),我在使用过程中也没有仔细考虑过这些接口的具体区别。后来一个工作经验丰富的同事看代码调优时说到了这一点:来,看看你的代码有什么问题吗?举个例子,我最初的代码是这样:#include <stdio.h>#include <string.h>void main(v原创 2020-10-01 09:46:53 · 5250 阅读 · 2 评论 -
Linux上使用设置printf显示的颜色
我们经常看到别的屏幕五颜六色的很是羡慕,看着很炫是吧。其实我们也可以自己做一个简单的修改,是我们的显示结果也呈现出不同的颜色。shell脚本可能设置的比较多,但是我们平常使用C语言却很少设置它的颜色,而实际上这个是可以设置的。格式如下:\033[字背景颜色;字体颜色m字符串\033[0m举个例子如下:(为了方便,我自己特意定义了用于两个调试的宏函数, 以后查看debug信息就方便很多了)#include <stdio.h>#define COL(x) "\033[;" #x原创 2020-05-09 00:14:16 · 4656 阅读 · 0 评论 -
inet_aton和inet_ntoa
3.1 inet_aton()int inet_aton(const char *cp, struct in_addr *inp); 参数说明:cp : IPv4点分十进制字符串,例如“192.168.1.2”、“10.28.1.1”等;inp: 点分十进制转换成二进制后的结构体(网络字节序)返回值:成功返回非0;失败返回0注意: 这个函数已经将inp转换为网...原创 2020-05-07 08:52:47 · 5384 阅读 · 0 评论 -
IPv4掩码与掩码位数的转换
1. 根据掩码获取掩码的位数int mask2len(unsigned int mask){ /*eg: 255.255.255.0 255.0.255.255.0*/ int bit=0,len=0; while( ~mask & (1ULL<<bit)) bit++; len = 32 - bit; if(...原创 2020-05-06 08:22:22 · 6664 阅读 · 0 评论 -
system、 exec函数族、fork函数用法说明
system(), exec函数族, fork函数用法说明启动一个新线程的方式: system()该函数经常用来在C程序中调用shell脚本或者命令行程序.特点:效率低下,首先需要创建一个shell, 然后配置shell环境,之后再执行相应的命令。对shell环境的依赖很大。 exec() 函数族也用来创建新的进程,但会替换原先的进程int execl(const cha...原创 2020-05-05 22:44:35 · 4071 阅读 · 0 评论 -
C语言实现任务调度与定时器
代码实现是在xl2tpd的源码中get到的,感觉很有意思的一段代码。基本功能就是实现定时器,时间到后从定时队列中取出,然后完成指定的任务。1. schedule.c代码(自己添加了main函数,用来调试)/* * Layer Two Tunnelling Protocol Daemon * Copyright (C) 1998 Adtran, Inc. * Copyright (C) 2...原创 2020-02-22 00:31:09 · 10127 阅读 · 0 评论 -
字符串转换为16进制
问题:将一个字符串转换为16进制数,例如“12”转换为0x12, "12345678"转换为0x12345678。实现:#include <stdio.h>#include <ctype.h>int char2bcd(char str, unsigned char *value){ if(!str || !value){ return -1; } ...原创 2020-01-07 13:15:54 · 10642 阅读 · 0 评论 -
零长度数组
什么是零长度数组顾名思义,零长度数组就是长度为0的数组。ANSI C 标准规定:定义一个数组时,数组的长度必须是一个常数,即数组的长度在编译的时候是确定的。在ANSI C 中定义一个数组的方法如下:int a[10];C99 新标准规定:可以定义一个变长数组。int len;int a[len];也就是说,数组的长度在编译时是未确定的,在程序运行的时候才确定,甚...原创 2019-12-22 22:21:51 · 7188 阅读 · 0 评论 -
Linux高级之语句表达式
表达式表达式和语句是 C 语言中的基础概念。什么是表达式呢?表达式就是由一系列操作符和操作数构成的式子。操作符可以是 C 语言标准规定的各种算术运算符、逻辑运算符、赋值运算符、比较运算符等。操作数可以是一个常量,也可以是一个变量。表达式也可以没有操作符,单独的一个常量甚至是一个字符串,也是一个表达式。下面的字符序列都是表达式:2 + 3 2 i = 2 + 3 i = i++ + 3...原创 2019-12-22 22:14:39 · 4246 阅读 · 0 评论 -
指针与引用, 值传递与地址传递的关系
前言“引用”的这个词我到经常使用到,但是它经常是作为动词出现的,而作为名词,我却很少用到。这个上次面试就问我指针和引用的区别,我就有点蒙圈了,因为对“引用”这个词确实不了解,然后面试官又问我知不知道值传递和地址传递,我差点拍案而起,心里想问我这个问题,是不是有点太简单了,然后回答的是:“值传递就是把变量的值直接传递给函数,在函数中可以使用但是无法修改原来的实参的值,而地址传递则是将变量的地址传递...原创 2019-05-21 22:43:20 · 5931 阅读 · 4 评论