1,程序运行时动态链接共享库;
libc(character),libm(math),使用标准库的函数;
eg:stdlib.h exit();
size_t数据类型,NULL空指针在头文件stddef.h define;
malloc,free stdlib.h
string.h strcat strcpy,strncpy;
程序按功能划分可分为数值运算,符号处理和I/O操作三类;
下面将测试使用相应的库函数做字符串初始化,取长度,拷贝,连接,搜索,比较;
1, 初始化字符串
#include <string.h>
void *memset(void *s,int c,size_t n);
返回值:s指向那,返回的指针就指向那,
s指向内存地址,c为在需在内存中填充的值,通常c=0,n为要填充的字节数;
需要初始化字符串的应用环境
函数的局部变量,初值不确定,可以用memset(buf, 0, 10),char buf[10]清零,malloc分配的内存初值也是不确定的,也可以用memset清零;
全局变量或静态变量则会自动化清零(位于.bss段);
2, 取字符串长度
#include <string.h>
size_t strlen(const char *s);
返回值:字符串的长度;
3, 内存字符串拷贝
#include <string.h>
void *memcpy(void *dest,const void *src,size_t n);
void *memmove(void *dest,const void *src,size_t n);
返回值:dest指向那,返回指针就指向那;
memcpy函数从src所指向的内存地址拷贝n个字节到dest所指向的内存地址;
以str开头的函数(eg:strcat,strcpy,strncpy)处理以'\0'结尾的字符串,而以mem开头的函数(memcpy,memncpy)则不关心'\0'字符,或者说这些函数并
不把参数当字符串看待,因此参数的指针类型是void *而非char *。
memmove也是从src所指的内存地址拷贝n个字节到dest所指的内存地址,虽然叫move但其实也是拷贝而非移动。但是和memcpy有一点不同,memcpy的两个参数src和dest所指的内存区间如果重叠则无法保证正确拷贝,而memmove却可以正确拷贝;
数组元素2中方式枚举
4, 字符串连接
char *strcat(char *dest,const char *src);
char *strncat(char *dest,const char *src,size_t n);
注意我们之前说过,str开头的函数对于'\0'的问题看官应该还记得;
[再请看官注意,dest缓冲区的Strlen长度应该是strlen(dest)+n+!]
5, 比较字符串
#include <string.h>
int memcmp(const void *s1,const void *s2,size_t n);
int strcmp(const char *s1,const char *s2);
int strncmp(const char *s2,const char *s2,size_t n);
返回值:负值表示s1<s2,0表示s1 == s2,正值表示s1>s2(值是Ascii表中的值)
memcmp从前到后逐个比较缓冲区s1,s2返回值(不管字符串中间是否有'\0');
strncmp的比较条件是:要么在其中一个字符串中遇到'\0'结束,要么比较完n个字符串;
#include <strings.h>
int strcasecmp(const char *s1,const char *s2);
int strncasecmp(const char *s1,const char *s2,size_t n);此处再解释下为何用size_t n是因为n是有符号的,可以为0 -1等,-1表示错误;
在比较过程中忽略大小写;此处不是C标准库,是POSIX标准;
6, 搜索字符串
char *strchr(const char *s,int c);
char *strrchr(const char *s,int c);
返回值:找到字符c,返回字符串s中指向字符c的指针,如果找不到字符c就返回NULL;
right-to-left;
查找字符串
#include <string.h>
char *strstr(const char *haystck,const hcar *needle);
strstr在一个长字符串中从前到后找一个子串(Substring);
7, 分割字符串
分隔符/界定符(delimiter);
#include <string.h>
char *strtok(char *str,const char *delim);
char *strtok r(char *str,const char *delim,char **saveptr);