1.初始化。
void *memset( void *s, int c, size_t n)
头文件:#include <string.h>
功能:把s所指的内存地址开始的n个字节填充为c的值。对于char buf[10],这样的声明,如果它是全局变量或者是静态变量,则自动初始化为0,如果是函数的局部变量初值就不确定,可以用memset(buf,0,10)清零;用malloc分配的内存初值也不是确定的,也要清零。
2.取长度
size_t strlen( const char *s)
头文件:#include <string.h>
功能:返回s所指的字符串的长度。第一个字符开始找'\0'字符,一旦找到就返回,长度不包括'\0'。char buf[]="hello",strlen(buf)返回5,如果定义char buf[5] = "hello"的话,strlen(buf)是危险的,因为buf里没有存'\0'字符,会造成越界。
3.拷贝
extern char * strcpy(char *dest, const char *src)
头文件:#include <string.h>
功能:把从src地址开始且含有'\0'结束符的字符串赋值到以dest开始的地址空间。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
void memcpy(void *dest, const void *src, size_t n)
void memmove(void *dest, const void *src, size_t n)
头文件:#include <string.h>
功能:memcpy函数从src所指的内存地址拷贝n个字节到dest所指的内存址,和strncpy不同,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。src和dest内存敬意不能重叠。
memmove也是从src所指的内存地址拷贝n个字节到dest所指的内存地址。虽然叫move但依然是拷贝而且移动。但是和memcpy不同的是src和dest可以重叠。
补充: char *strdup( const char *s)
头文件:#include<string.h>
这个函数调用malloc动态分配内存,把字符串s拷贝到新分配的内存中然后返回。用这个函数省去了事先为新字符串分配内存的麻烦,但是用完之后一定要记得调用free释放新字符串的内存。
4.连接
char *strcat( char *dest, const char *src)
char *strncat( char *dest, const char *src, size_t n)
头文件:#include<string.h>
功能:把dest的字符串连接上src字符串,返回dest地址。
注意:strcat和strcpy一样,要确保dest缓冲区足够大,否则会导致缓冲区溢出错误。
5.比较
int memcmp( const void *s1, const void *s2, size_t n);
int strcmp( const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
头文件:#include<string.h>
返回:负值表示s1<s2,0表示s1=s2,正值表示s1>s2
功能:memcmp从前到后逐个比较缓冲区s1和s2的前n个字节(不管里面有没有'\0')
strcmp把s1和s2当字符串比较,其中一个字符串遇到'\0'时结束。
6.搜索
#include<string.h>
char *strchr( const char *s, int c);
char *strrchr( const char *s, int c);
返回值:如果找到字符c,返回字符串s中指向字符c的指针,如果找不到返回NULL
功能:strchr在字符串s中从前到后查找字符c,找到字符c第一次出现的位置就返回。
#include<string.h>
char *strstr( const char *haystack, const char *needle);
功能:在haystack里搜needle串。
7.分割
#include<string.h>
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
返回:返回指向下一个Token的指针,如果没有下一个Token了就返回NULL。
功能:把str中用delim分隔符分开成,delim可以是一个或者几个。
注意:空字符串被Token忽略。
void *memset( void *s, int c, size_t n)
头文件:#include <string.h>
功能:把s所指的内存地址开始的n个字节填充为c的值。对于char buf[10],这样的声明,如果它是全局变量或者是静态变量,则自动初始化为0,如果是函数的局部变量初值就不确定,可以用memset(buf,0,10)清零;用malloc分配的内存初值也不是确定的,也要清零。
2.取长度
size_t strlen( const char *s)
头文件:#include <string.h>
功能:返回s所指的字符串的长度。第一个字符开始找'\0'字符,一旦找到就返回,长度不包括'\0'。char buf[]="hello",strlen(buf)返回5,如果定义char buf[5] = "hello"的话,strlen(buf)是危险的,因为buf里没有存'\0'字符,会造成越界。
3.拷贝
extern char * strcpy(char *dest, const char *src)
头文件:#include <string.h>
功能:把从src地址开始且含有'\0'结束符的字符串赋值到以dest开始的地址空间。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
void memcpy(void *dest, const void *src, size_t n)
void memmove(void *dest, const void *src, size_t n)
头文件:#include <string.h>
功能:memcpy函数从src所指的内存地址拷贝n个字节到dest所指的内存址,和strncpy不同,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。src和dest内存敬意不能重叠。
memmove也是从src所指的内存地址拷贝n个字节到dest所指的内存地址。虽然叫move但依然是拷贝而且移动。但是和memcpy不同的是src和dest可以重叠。
补充: char *strdup( const char *s)
头文件:#include<string.h>
这个函数调用malloc动态分配内存,把字符串s拷贝到新分配的内存中然后返回。用这个函数省去了事先为新字符串分配内存的麻烦,但是用完之后一定要记得调用free释放新字符串的内存。
4.连接
char *strcat( char *dest, const char *src)
char *strncat( char *dest, const char *src, size_t n)
头文件:#include<string.h>
功能:把dest的字符串连接上src字符串,返回dest地址。
注意:strcat和strcpy一样,要确保dest缓冲区足够大,否则会导致缓冲区溢出错误。
5.比较
int memcmp( const void *s1, const void *s2, size_t n);
int strcmp( const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
头文件:#include<string.h>
返回:负值表示s1<s2,0表示s1=s2,正值表示s1>s2
功能:memcmp从前到后逐个比较缓冲区s1和s2的前n个字节(不管里面有没有'\0')
strcmp把s1和s2当字符串比较,其中一个字符串遇到'\0'时结束。
6.搜索
#include<string.h>
char *strchr( const char *s, int c);
char *strrchr( const char *s, int c);
返回值:如果找到字符c,返回字符串s中指向字符c的指针,如果找不到返回NULL
功能:strchr在字符串s中从前到后查找字符c,找到字符c第一次出现的位置就返回。
#include<string.h>
char *strstr( const char *haystack, const char *needle);
功能:在haystack里搜needle串。
7.分割
#include<string.h>
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
返回:返回指向下一个Token的指针,如果没有下一个Token了就返回NULL。
功能:把str中用delim分隔符分开成,delim可以是一个或者几个。
注意:空字符串被Token忽略。