数执行任务时,它将会修改它所处理的字符串.如果源字符串不能被修改,那就复制一份,将这份拷贝传递给strtok函数.
如果strtok函数的第一个参数不是NULL,函数将找到字符串的第一个字串(由分隔符分隔出来的子串).strtok同时将保存它在字符串中的位置.如果strtok函数的第一个参数是NULL,函数就在同一个字符串中从这个被保存的位置开始像前面一样查找下一个子串,如果字符串内不存在更多的子串,strtok函数就返回一个NULL指针.在典型情况下,在第一次调用相等的strtok时,向它传递一个指向字符串的指针.然后这个函数被重复调用(第一个参数置为NULL),直到它返回NULL为止.
下面是一个简短的例子.这个函数从第一个参数字符串中分离出由空白符分隔的子串,并把它们打印出来.
#include
#include
void print_tok(char *line)
{
static char whitespace[] = “\t\f\r\v\n”
char *token;
for(token = strtok(line, whitespace); token != NULL; token = strtok(NULL, whitespace) )
printf(“Next token is %s\n”, token);
}
如果你愿意,你可以在每次调用strtok函数时使用不同的分隔符集合,当一个字符串的不同部分由不同的字符集合分隔的时候,这个技巧很管用.
提示: 由于strtok函数保存它所处理的函数的局部状态信息,所以你不能用它同时解析两个字符串.因此,如果for循环的循环体内调用了一个在内部调用strtok函数的函数,则上面的例子将会失败.
位段
位段的声明和任何普通的结构体成员的声明相同,但有两处例外,首先,位段成员必须声明为int,signed int,unsigned int类型.其次,在成员名的后面是一个冒号和一个整数,这个整数指定该位段所占用的位数目.
用signed或unsigned整数显式地声明位段是个好注意.如果把位段声明为int类型,它究竟被解释为有符号数还是无符号数是由编译器决定的.
注重可移植性的程序应该避免使用位段.由于下面这些与实现有关的依赖性,位段在不同的系统中可能有不同的结果.
1. int位段被当作有符号还是无符号数.
2. 位段中位的最大数目.许多编译器把位段成员的长度限制在一个整型值的长度之内,所以一个能够运行于32位整数的机器上的位段声明可能在16位整数的机器上无法运行.
3. 位段中的成员在内存中是从左向右分配还是从右向左分配的.
4. 当一个声明指定了两个位段,第2个位段比较大,无法容纳于第1个位段剩余的位时,编译器有可能把第2个位段放在内存的下一个字,也可能直接放在第1个位段后面,从而在两个内存位置的边界上形成重叠.
下面是一个位段声明的例子:
struct CHAR {
unsigned ch : 7;
unsigned font : 6;
unsigned size : 19;
};
struct CHAR ch1;
动态内存分配
下面这些函数在stdlib.h中声明
viod *malloc(size_t size);
void *calloc(size_t num_elements, size_t element_size);
void realloc(void *ptr, size_t new_size);
void free(void *pointer);
malloc的参数就是需要分配的内存字节数,malloc分配的是一块连续的内存,如果内存池中的可用内存可以满足这个需求,malloc就返回一个指向被分配的内存块起始位置的指针.如果操作系统无法向malloc提供更多的内存,malloc就返回一个NULL指针.因此,对每个从malloc返回的指针都进行检查,确保它并非NULL是非常重要的.
对于要求边界对齐的机器,malloc所返回的内存的起始位置将始终能够满足对边界对齐要求最严格的类型的要求.
mllloc和calloc之间的主要区别是后者在返回指向内存的指针之前把它初始化为0.这个初始化常常能带来方便,但如果你的程序只是想把一些值存储到数组中,那么这个初始化过程纯属浪费时间.
realloc函数用于修改一个原先已经分配的内存块的大小.使用这个函数,你可以使一块内存扩大或缩小.如果它用于扩大一个内存,那么这块内原先的内容依然保留,新增加的内存添加到原先内存块的后面,新内存并未以任何方法进行初始化.如果它用于缩小一个内存块,该内存块尾部的部分内存便被拿掉,剩余部分内存的原先内容依然保留.如果原先的内存块无法改变大小,realloc将分配另一块正确大小的内存,并把原先那块内存的内容复制到新的块上.因此,在使用realloc之后,你就不能再使用指向旧内存的指针,而是应该改用realloc所返回的新指针.如果realloc函数的第一个参数是NULL,那么它的行为就和malloc一模一样.
free的参数是一个先前从malloc,calloc,realloc返回的指针.向free传递一个NULL参数不会产生任何效果
摘自 DLUTXIE