随笔分类 -  C/C++语言

1
记录学习和工作中遇到的问题
摘要:1、前言 最近因为工作需要判断一个域名是否备案,实际提取的域名就是HTTP报文中的Host的内容,而判断一个域名是否是根据根域名进行的。例如访问www.qq.com,提取Host的内容为www.qq.com,而判断这个域名是否备案,是通过qq.com进行,因此需要从Host内容中提取出根域名。 遇到 阅读全文
posted @ 2017-09-24 10:49 Rabbit_Dale 阅读(2184) 评论(0) 推荐(1) 编辑
摘要:1、前言 最近在网上看到一道C语言题目,用C语言实现一个函数,给定一个int类型的整数,函数输出逆序的整数,例如输入123,则输出字符串"321",,输入-123,则输出字符串"-321"。题目要求,不使用标准库,不得分配内存。当时觉得蛮简单的,这不就是类似字符串逆转嘛,自己尝试做了一下,测试发现, 阅读全文
posted @ 2017-06-17 12:01 Rabbit_Dale 阅读(3148) 评论(5) 推荐(2) 编辑
摘要:1、前言 当前计算机都是多核的,linux2.6提供了进程绑定cpu功能,将进程指定到某个core上执行,方便管理进程。linux提供了sysconf系统调用可以获取系统的cpu个数和可用的cpu个数。2、sysconf 函数 man一下sysconf,解释这个函数用来获取系统执行的配置信息。例... 阅读全文
posted @ 2014-05-25 17:18 Rabbit_Dale 阅读(27573) 评论(3) 推荐(2) 编辑
摘要:1、前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0]。这样设计的目的是让数组长度是可变的,根据需要进行分配。方便操作,节省空间。2、data... 阅读全文
posted @ 2014-05-21 23:25 Rabbit_Dale 阅读(41373) 评论(10) 推荐(7) 编辑
摘要:1、前言 今天在公司看一同事写的代码,代码中用到了struct,初始化一个struct用的是乱序格式,如下代码所示:typedef struct _data_t { int a; int b;}data_t;data_t data = { .a = 10, .b = 20,}; 通常初始化一个结构体的方式是按序初始化,形如:data_t data={10,20}。感觉很好奇,如是上网百度一下,发现linux下struct初始化可以采用顺序和乱序两种方式,而乱序又有两种不同的形式。本文总结一下struct两种初始化方式的优缺点,并给出完整的测试程序。2、顺序初始化 教科... 阅读全文
posted @ 2014-02-11 22:48 Rabbit_Dale 阅读(22742) 评论(3) 推荐(8) 编辑
摘要:1、前言 OUI是指Organizationally unique identifier (组织唯一标识符),签发给各类组织的唯一标识符。MAC地址共有6个字节48位组成,前3个字节体现了OUI,其表明了NIC的制造组织。通常情况下,该标识符是唯一的。详细介绍参考:http://standards.ieee.org/develop/regauth/oui/public.html。oui.txt文件中记录世界所有网卡的制造厂商,共有18859个。文件中记录mac的前三位与公司的对应关系。本文目地是对oui.txt文件进行解析,生产一个信息的文件,在程序中可以根据制定的mac地址,快速查找其对应. 阅读全文
posted @ 2013-12-22 20:21 Rabbit_Dale 阅读(6333) 评论(4) 推荐(1) 编辑
摘要:1、前言 今天在看代码时,遇到offsetof和container_of两个宏,觉得很有意思,功能很强大。offsetof是用来判断结构体中成员的偏移位置,container_of宏用来根据成员的地址来获取结构体的地址。两个宏设计的很巧妙,值得学习。linux内核中有着两个宏的定义,并在链表结构中得到应用。不得不提一下linux内核中的链表,设计的如此之妙,只需要两个指针就搞定了。后续认真研究一下这个链表结构。2、offsetof宏 使用offsetof宏需要包含stddef.h头文件,实例可以参考:http://www.cplusplus.com/reference/cstddef/of.. 阅读全文
posted @ 2013-12-12 23:53 Rabbit_Dale 阅读(21503) 评论(7) 推荐(8) 编辑
摘要:1、前言 最近看到一份代码,看到一个函数前面用__attribute__((destructor))修饰,当时感觉有点怪怪的,搜了整个程序,也没发现哪个地方调用这个函数。于是从字面意思猜想,该函数会在程序结束后自动调用,与C++中的析构函数类似。第一次接触GNU下的attribute,总结一下。2、__attribute__介绍 __attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。__attribute__前后都有两个下划线,并且后面会紧跟一对原括弧,括弧里面是相应的.. 阅读全文
posted @ 2013-12-07 00:50 Rabbit_Dale 阅读(5549) 评论(2) 推荐(0) 编辑
摘要:1、前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量。由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针。感觉很奇怪,为何要将一个指针这样做呢?如是果断上网查查,发现我的感觉是错误的,所以,任何事情不能凭感觉,要弄清楚来龙去脉。先总结一下intptr_t类型,然后介绍指针与intptr_t类型的转换,最后给出测试程序。2、intptr_t类型 我接触最早的处理器是32位,目前64位处理器发展迅速。数据类型特别是int相关的类型在不同位数机器的平台下长度不同。C99标准并不规定具体数据类型的长度大小。位数charshortin.. 阅读全文
posted @ 2013-11-22 23:52 Rabbit_Dale 阅读(37939) 评论(6) 推荐(4) 编辑
摘要:1、前言 今天看代码时候,遇到一些宏,之前没有见过,感觉挺新鲜。如是上网google一下,顺便总结一下,方便以后学习和运用。C语言程序中广泛的使用宏定义,采用关键字define进行定义,宏只是一种简单的字符串替换,根据是否带参数分为无参和带参。宏的简单应用很容易掌握,今天主要总结一下宏的特殊符号及惯用法。 (1)宏中包含特殊符号:#、##. (2)宏定义用do{ }while(0)2、特殊符号#、##(1)# Whenyouputa#beforeanargumentinapreprocessor macro,thepreprocessorturnsthatargumentintoac... 阅读全文
posted @ 2013-11-12 01:04 Rabbit_Dale 阅读(61898) 评论(5) 推荐(2) 编辑
摘要:1、前言 我们经常涉及到数字与字符串之间的转换,例如将32位无符号整数的ip地址转换为点分十进制的ip地址字符串,或者反过来。从给定的字符串中提取相关内容,例如给定一个地址:http://www.bokeyuan.cn:2345,我们要从地址中提出协议,主机地址和端口号。之前对字符串和数字之间的关系不是很熟悉,工作中经常涉及到这个,如是好好总结一下。C语言提供了一些列的格式化输入输出函数,最基本的是面向控制台标准输出和输入的printf和scanf,其实还有面向字符串的sprint和sscanf,面向文件的流的fprintf和fscanf。今天着重总结一下sprintf和sscanf系列... 阅读全文
posted @ 2013-10-04 00:40 Rabbit_Dale 阅读(49929) 评论(2) 推荐(10) 编辑
摘要:1、前言 最近在再看《程序员的自我修养》这本书,对程序的链接、装载与库有了更深入的认识。关于这本书的评价可以去豆瓣看看http://book.douban.com/subject/3652388/,强烈推荐给每一位程序员哈。今天看了第十章内存,主要讲的是栈和堆的管理。主要问题是:函数在栈中是如何布局的,如何通过缓冲区溢出来调用另外一个函数,即堆栈溢出攻击。2、基本概念 栈(stack):我第一次接触栈是从数据结构中,此时的栈是一种基本数据结构,栈的基本属性是先进后出(FILO)。 在计算机系统中,栈是一个具有先进后出属性的动态内存区域。程序可以将数据压入栈,也可以将数据从栈顶弹出。栈的增... 阅读全文
posted @ 2013-08-08 00:02 Rabbit_Dale 阅读(4598) 评论(8) 推荐(4) 编辑
摘要:题目要求:编程实现计算器程序,完成实数的加、减、乘、除运算。注意运算符优先级别。表达式要求采用中缀形式,例如:2.3+7.2*7提示:表达式处理可参考“逆波兰表达式”范例。完整程序如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define MAXSIZE 100 6 #define SYMBOLSIZE 50 7 8 //表达式运算符结构体 9 typedef struct oper_symbol 10 { 11 char oper; //运算符 12 u. 阅读全文
posted @ 2013-05-13 00:02 Rabbit_Dale 阅读(3192) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个无符号的一位整数的四则运算表达式,输出其结果。例如输入:1+3*6-2,则输出:17分析:因为不涉及到括号,只是简单的四则运算,我的想法是如果有乘除法先计算,没有的话就按照加减法从左到右的顺序进行计算。在开始的时候,首先检查是否有乘除法运算符,有的话就取出前后两个操作数进行计算,将结果保存起来。没有的话就将加减运算符先存起来。主要过程:1、输入的是一个四则运算的表达式,在计算机中按照字符串的形式存储。数据和运算符需要分开处理。2、引入一个整型的数组,其大小为字符串长度加一,加一是为了方便整型数组判断结束。3、对表达式字符串循环进行字符判断,如果是数字,则将数组存入引入的整型数组, 阅读全文
posted @ 2013-05-12 14:31 Rabbit_Dale 阅读(2369) 评论(1) 推荐(0) 编辑
摘要:1、实验题目:长整型数运算,C中的long int所能表示的数据范围有限,现要求编程完成超过long int所能表示的数据范围以上的十进制正的长整数的加法和乘法运算。2、实验提示:两个参与运算的长整数可用char a[256], b[256]表示,整个程序中要求完成以下几个函数的编写:1) int readlongint(char * x); 此函数用于读入一个正的长整数到x中,函数返回长整数的实际长度;要求输入时检查所读入的字符串是否是合法的长整数,如不是提示用户直到输入合法的长整数为止;2) char *addition(char *x,char *y); 此函数用于实现用字符串表示的长整 阅读全文
posted @ 2013-05-07 20:08 Rabbit_Dale 阅读(3173) 评论(1) 推荐(1) 编辑
摘要:实验题目:学生信息管理系统实验要求:用户可以选择1-7可以分别进行学生信息的查看、添加、删除,修改,计算平均成绩,保存,退出系统操作。提示:用一个结构体类型表示学生信息 1 typedef struct node /*定义结构体*/ 2 { 3 int num; //学号 4 char name[15];//姓名 5 char sex[9]; //性别 6 int age; //年龄 7 int english; //英语成绩 8 int math; //数学成绩 9 int computer;//计算机成绩10 int av... 阅读全文
posted @ 2013-05-06 19:46 Rabbit_Dale 阅读(7955) 评论(1) 推荐(1) 编辑
摘要:前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数。在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示。我写程序的错误如下程序所示: 1 #include 2 void print(int *a[3]) 3 { 4 printf("%d\n",a... 阅读全文
posted @ 2013-03-09 19:50 Rabbit_Dale 阅读(71570) 评论(4) 推荐(6) 编辑
摘要:前言:今天上网看帖子的时候,看到关于尾递归的应用(http://bbs.csdn.net/topics/390215312),大脑中感觉这个词好像在哪里见过,但是又想不起来具体是怎么回事。如是乎,在网上搜了一下,顿时豁然开朗,知道尾递归是怎么回事了。下面就递归与尾递归进行总结,以方便日后在工作中使用。1、递归 关于递归的概念,我们都不陌生。简单的来说递归就是一个函数直接或间接地调用自身,是为直接或间接递归。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。用递归需要注意以下两点:(1) 递归就是在过程或函数里调用自身。(2) ... 阅读全文
posted @ 2013-03-04 22:12 Rabbit_Dale 阅读(38511) 评论(11) 推荐(15) 编辑
摘要:今天在练习hash table时候,准备采用vetor和list进行实现,当我定义一个模板类的迭代器时候,出现错误。于是我在网上找找如何处理这个问题,最终解决了问题,记录在此以后,便于以后查看。我写的测试程序如下: 1 #include <iostream> 2 #include <vector> 3 #include <list> 4 using namespace std; 5 6 template <class T> 7 class Test 8 { 9 public:10 void insert(const T& x)11 {12 阅读全文
posted @ 2013-01-28 13:02 Rabbit_Dale 阅读(5015) 评论(0) 推荐(0) 编辑
摘要:一般我们编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数。这也是c功能强大的一个方面,例如我们经常用到的标准输入scanf和标准输出printf函数,函数原型如下:int scanf(const char *format, ...); intprintf(const char *format, ...); 它的第一个参数是format,属于固定参数,后面跟的参数的个数和类型都是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式:printf("%d& 阅读全文
posted @ 2012-12-27 22:13 Rabbit_Dale 阅读(2075) 评论(0) 推荐(0) 编辑

1