C 中 fgets 的用法和注意事项

fgets 函数的声明如下:

s 表示待接收字符串的缓冲区,size 为最大大小,stream 为读取的数据流。

对于数据的读取来说,函数实际最多读到 size - 1 个字节,如果读取的数据比这个长,会自动截断,保证在最后以\0 结尾,要注意的是读取字符时会把\n 也读进来

阅读更多

C++中可变长参数的使用方法

一、可变长参数介绍

某些情况下为了完成一些功能,需要用到可变长参数的函数,例如我们最常用的 printf 和 scanf 函数:

它们首先都是一个字符串打头,后面再跟上不定数量的参数,为我们的输出形式提供了多样性。

对于像这样的不定长参数的函数来说,它的声明形式为:

阅读更多

do-while(0) 在宏定义中的作用

do { ... } while(0)是 C/C++中常见的定义方式,使用它构造后的宏定义不会受到大括号、分号等的影响,总是会按你期望的方式调用运行。

一、错误引出

以下宏定义:

对于语句 f(1,2);,宏定义将会替换成:

阅读更多

C/C++中常见的宏

一、判断编译器是 C 或者 C++ 通过__cplusplus 判断 C/C++:

代码格式化工具 astyle 的安装和使用

astyle 是一个代码格式化工具,为 C,C++,JAVA 等语言提供代码格式化功能。

官方描述为:Artistic Style is a source code indenter, formatter, and beautifier for the C, C++, C++/CLI, Objective‑C, C# and Java programming languages.

相关页面:官方地址文档地址下载页面(当前最新版本位 3.1) 。

一、编译安装

安装可参考官方安装文档,提供了多种方式编译安装,这里使用 cmake

默认情况下,可执行文件被安装在/usr/bin,文档放在/usr/share/doc/astyle,安装完成后直接就可使用 astyle 命令。

官方并没有提供 make uninstall 卸载的功能,如需卸载需要在编译目录下执行 xargs rm < install_manifest.txt

阅读更多

c++调用 lua 错误集锦

一、 luaL_dofile(): cannot open ./lib.lua: No such file or directory

问题原因

运行应用的目录和 lua 文件不在同一个目录,.lua 文件所在的目录是当前所在的目录而不是程序所在目录。

app 在当前目录下的 debug 目录下,在当前目录下执行./debug/app 可以成功读取到 lib.lua,但是在 debug 目录下执行./app 就会报错。

阅读更多

面试题:转换十六进制字符串到十六进制数据

前几天面试时候遇到的问题:

给定一个十六进制字符串"AB",转换成十六进制的整数 0xab 输出。

临时接到的面试通知,赶场子过去一坐下就给个题目,说实话面试了一两个星期是第一次做这方面的面试题。没有思想准备,当时脑海里就闪过两个念头,一个是左移,一个是直接进制转换。

阅读更多

vector 中 reserve 和 resize 的区别

reserve 方法用来给 vector 预留空间,预留的空间只会改变 capacity 的大小,不会改变 size 大小。 resize 方法表示重新调整数组大小,capacity 和 size 都会改变。 使用 reserve 后,不能直接使用下标来增加元素,虽然内存是已经分配了直接使用不会报错,但是直接通过下标来复制会导 ... 阅读更多

多态的原理:vptr 指针和 vtable 虚函数表

多态是 C++中的重要内容,也是设计模式的基础。

形成多态的几个基本条件为:

  • 继承和虚函数
  • 父类对象指向子类对象

多态形成的原理就是 vptr 指针和 vtable 虚函数表,当一个类中有虚函数时,编译器就会自动生成虚函数表,并生成一个 vptr 指针指向这个虚函数表。调用虚函数的时候,会通过这个 vptr 指针找到相应的虚函数表,然后再定位到对应的函数,以此来调用形成多态。

阅读更多

socket 多路 IO 复用之 select 模型

select 模型是 socket 中的一种多路 IO 复用模型之一,通过轮询的方式来完成多路访问控制。

一个很简单的例子来描述 select 模型:

幼儿园老师要照顾所有的小朋友,每天他都会轮流去问小朋友:「小朋友小朋友,你饿了吗?」

如果小朋友饿了,那么老师就给这个小朋友喂饭,否则就开始询问下一个朋友,一直循环下去直到放学。

同时,如果班级里有其他的同学来了,也把他加到询问队列。如果有哪个同学生病了,则把它踢出询问队列。

select 模型的原理就是这样,把所有连接的客户端 socket 加入到一个集合中去,然后一直不断轮询,判断哪一个 socket 有数据到达,就读取数据。否则继续轮询下一个数据。

linux 系统在编译的时候就固定了 select 模型文件描述符集合的大小为 1024 个,这个大小无法更改,因此,select 模型只适用于并发量小于 1024 个的服务连接。

阅读更多