fgets 函数的声明如下:
|
1 |
char *fgets(char *s, int size, FILE *stream); |
s 表示待接收字符串的缓冲区,size 为最大大小,stream 为读取的数据流。
对于数据的读取来说,函数实际最多读到 size - 1 个字节,如果读取的数据比这个长,会自动截断,保证在最后以\0 结尾,要注意的是读取字符时会把\n 也读进来。
fgets 函数的声明如下:
|
1 |
char *fgets(char *s, int size, FILE *stream); |
s 表示待接收字符串的缓冲区,size 为最大大小,stream 为读取的数据流。
对于数据的读取来说,函数实际最多读到 size - 1 个字节,如果读取的数据比这个长,会自动截断,保证在最后以\0 结尾,要注意的是读取字符时会把\n 也读进来。
某些情况下为了完成一些功能,需要用到可变长参数的函数,例如我们最常用的 printf 和 scanf 函数:
|
1 2 |
scanf("%d %d", &a, &b); printf("%d %d\n", a, b); |
它们首先都是一个字符串打头,后面再跟上不定数量的参数,为我们的输出形式提供了多样性。
对于像这样的不定长参数的函数来说,它的声明形式为:
|
1 |
int func(int a, int b, ...); |
do { ... } while(0)是 C/C++中常见的定义方式,使用它构造后的宏定义不会受到大括号、分号等的影响,总是会按你期望的方式调用运行。
以下宏定义:
|
1 |
#define f(a,b) a(a); b(b) |
对于语句 f(1,2);,宏定义将会替换成:
|
1 |
a(1); b(2); |
一、判断编译器是 C 或者 C++ 通过__cplusplus 判断 C/C++:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
// 如果是 C++,使用扩展 C 的关键字 #ifdef __cplusplus extern "C" { #endif struct string_t *create_string(int max_len); struct string_t *copy_string(const char *str); void release_string(struct string_t *str); #ifdef __cplusplus } #endif |
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 。
|
1 2 3 4 5 6 7 8 9 10 |
# 解压 tar -zxvf astyle_3.1_linux.tar.gz cd astyle # 创建编译文件夹 mkdir as-gcc-exe cd as-gcc-exe cmake .. # 编译和安装 make make install |
默认情况下,可执行文件被安装在/usr/bin,文档放在/usr/share/doc/astyle,安装完成后直接就可使用 astyle 命令。
官方并没有提供 make uninstall 卸载的功能,如需卸载需要在编译目录下执行 xargs rm < install_manifest.txt 。
问题原因
运行应用的目录和 lua 文件不在同一个目录,.lua 文件所在的目录是当前所在的目录而不是程序所在目录。
|
1 2 3 4 5 6 7 8 9 |
ma@ubuntu:/data/code/lua/2-lua 和 c++/cpp-lua$ tree . ├── debug │ └── app ├── lib.lua ├── main.cpp └── Makefile 1 directory, 6 files |
app 在当前目录下的 debug 目录下,在当前目录下执行./debug/app 可以成功读取到 lib.lua,但是在 debug 目录下执行./app 就会报错。
前几天面试时候遇到的问题:
给定一个十六进制字符串
"AB",转换成十六进制的整数0xab输出。
临时接到的面试通知,赶场子过去一坐下就给个题目,说实话面试了一两个星期是第一次做这方面的面试题。没有思想准备,当时脑海里就闪过两个念头,一个是左移,一个是直接进制转换。
reserve 方法用来给 vector 预留空间,预留的空间只会改变 capacity 的大小,不会改变 size 大小。 resize 方法表示重新调整数组大小,capacity 和 size 都会改变。 使用 reserve 后,不能直接使用下标来增加元素,虽然内存是已经分配了直接使用不会报错,但是直接通过下标来复制会导 ... 阅读更多
多态是 C++中的重要内容,也是设计模式的基础。
形成多态的几个基本条件为:
多态形成的原理就是 vptr 指针和 vtable 虚函数表,当一个类中有虚函数时,编译器就会自动生成虚函数表,并生成一个 vptr 指针指向这个虚函数表。调用虚函数的时候,会通过这个 vptr 指针找到相应的虚函数表,然后再定位到对应的函数,以此来调用形成多态。
select 模型是 socket 中的一种多路 IO 复用模型之一,通过轮询的方式来完成多路访问控制。
一个很简单的例子来描述 select 模型:
幼儿园老师要照顾所有的小朋友,每天他都会轮流去问小朋友:「小朋友小朋友,你饿了吗?」
如果小朋友饿了,那么老师就给这个小朋友喂饭,否则就开始询问下一个朋友,一直循环下去直到放学。
同时,如果班级里有其他的同学来了,也把他加到询问队列。如果有哪个同学生病了,则把它踢出询问队列。
select 模型的原理就是这样,把所有连接的客户端 socket 加入到一个集合中去,然后一直不断轮询,判断哪一个 socket 有数据到达,就读取数据。否则继续轮询下一个数据。
linux 系统在编译的时候就固定了 select 模型文件描述符集合的大小为 1024 个,这个大小无法更改,因此,select 模型只适用于并发量小于 1024 个的服务连接。
|
1 2 |
> grep "FD_SETSIZE" /usr/include/ -R /usr/include/linux/posix_types.h:#define __FD_SETSIZE 1024 |