C语言编程
sscanf()与scanf()类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
头文件:#include<stdio.h>
格式: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);上述代码的运行结果为3,4,3,4。
#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" };