C语言编程
sscanf()与scanf()类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
头文件:#include
格式:int sscanf(const char *buffer,const char *format,[argument ]...);
举例:
char *p = "123";
int val = 0;
sscanf(p,"%d",&val);
则val == 123。
在嵌入式开发尤其是linux kernel中常用到零长度数组,可以用零长度数组成员作为可变长度数组的占位符。如以下定义:
typedef struct my_data
{
int val;
int len;
char var[0];//零长度数组成员
}data_t;
其中的成员var[0]为零长度数组,由于它的长度为零,即不占存储空间,因此以上结构体所占用的空间sizeof( struct my_data) == sizeof(val+len)。那么,var[0]成员有什么用途呢?其功能就是,我们可以定义可变长度的数组,并通过var[i]访问该结构体中成员len之后的第i个数据。
如下所示:
#define LEN 10
data_t *test = malloc(sizeof(data_t)+LEN);
test->var[8] = 5;//访问另外LEN内的数据
因此,注意数组名与函数指针之间的差异。
struct OffsetTest
{
char a; //offset->0
char b; //offset->1
char c; //offset->2
char d; //offset->3
int e; //offset->4
int f; //offset->8
};
则可以通过如下定义的宏计算结构体中任意一个元素的相对偏移:
#define OFFSET_OF(struct_name, field) ((int)&((struct_name *)0)->field)
而计算结构体的大小可以直接用sizeof()运算符计算。
itoa():将整型值转换为字符串,atoi()则实现相反的操作。
在不支持这两个库函数的系统中,可以自己编写类似功能的函数。如下所示:
int my_atoi(char *str)
{
int i = 0,ret = 0;
ret = (*str++ - '0');
while(*str)
{
ret = ret*10 + (*str - '0');
str++;
}
return ret;
}
#define ROTATE_LEFT(x,n) ((x) << (n)) | ((x) >> (sizeof(x)*8 - (n)))
#define ROTATE_RIGHT(x,n) ((x) >> (n)) | ((x) << (sizeof(x)*8 - (n)))
unsigned int factorial(unsigned int n)
{
unsigned int result = 0;
if(n >= 2)
{
return n*factorial(n-1);
}
return 1;
}
int a = 1,b = 2;
printf("Result = %d!\n",(a = b+a,a));
如,上述代码执行的结果为3。
int a = 1,b = 2;
printf("Result = %d,%d,%d,%d!\n",a,b,a += b,b += a);
上述代码的运行结果为4,3,4,3。
#define get_val(n) \
({ \
unsigned int v; \
if (n > 100) \
v = 1; \
else \
v = 0; \
v; \
})
#define LOG(fmt,arg...) printf(fmt,##arg)
__align(4) uint8_t DataBuf[2048];
static CommandInfo commands[] = {
#include "my_commands.h"
};