您的位置:首页 > 其它

字符串相关操作函数汇总

2012-10-13 15:27 225 查看
1、 字符串的初始化函数

void *memset(void *s, int c, size_t n);

返回值:s指向哪,返回的指针就指向哪

说明:memset
函数把
s
所指的内存地址开始的
n
个字节都填充为
c
的值。通常
c
的值为0,把一块内存区清零。例如定义
char
buf[10];
,如果它是全局变量或静态变量,则自动初始化为0(位于
.bss
段),如果它是函数的局部变量,则初值不确定,可以用
memset(buf, 0, 10)
清零,由
malloc
分配的内存初值也是不确定的,也可以用
memset
清零。

2、取字符串的长度

size_t strlen(const char *s);

返回值:字符串的长度

说明:返回的长度不包括
'\0'
字符在内

3、拷贝字符串

char *strcpy(char *dest,const char *src);

说明:strcpy
在拷贝字符串时会把结尾的
'\0'
也拷到
dest
中,因此保证了
dest
中是以
'\0'
结尾的字符串。
strcpy
只知道
src
字符串的首地址,不知道长度,它会一直拷贝到
'\0'
为止,所以
dest
所指向的内存空间要足够大,否则有可能写越界。如果没有保证
src
所指向的内存空间以
'\0'
结尾,也有可能读越界。
src
dest
所指向的内存空间不能有重叠。

char *strcpy(char *dest,const char *src,size_t n);

说明:strncpy
的参数
n
指定最多从
src
中拷贝
n
个字节到
dest
中,换句话说,如果拷贝到
'\0'
就结束,如果拷贝到
n
个字节还没有碰到
'\0'
,那么也结束,调用者负责提供适当的
n
值,以确保读写不会越界,比如让
n
的值等于
dest
所指向的内存空间的大小。这意味着
dest
有可能不是以
'\0'
结尾的。如果
src
字符串全部拷完了不足
n
个字节,那么还差多少个字节就补多少个
'\0'。


void *memcpy(void *dest, const void *src, size_t n);

说明:
memcpy
函数从
src
所指的内存地址拷贝
n
个字节到
dest
所指的内存地址,和
strncpy
不同,
memcpy
并不是遇到
'\0'
就结束,而是一定会拷贝完
n
个字节。

void *memmove(void *dest, const void *src, size_t n);

说明:
memmove
也是从
src
所指的内存地址拷贝
n
个字节到
dest
所指的内存地址,虽然叫move但其实也是拷贝而非移动。但是和
memcpy
有一点不同,
memcpy
的两个参数
src
dest
所指的内存区间如果重叠则无法保证正确拷贝,而
memmove
却可以正确拷贝。

4、连接字符串

char *strcat(char *dest, const char *src);

说明:调用者必须确保
dest
缓冲区足够大,否则会导致缓冲区溢出错误。
strncat
函数通过参数
n
指定一个长度,就可以避免缓冲区溢出错误。

char *strncat(char *dest, const char *src, size_t n);

返回值:dest指向哪,返回的指针就指向哪

说明:参数
n
的含义和
strncpy
的参数
n
不同,它并不是缓冲区
dest
的长度,而是表示最多从
src
缓冲区中取
n
个字符(不包括结尾的
'\0'
)连接到
dest
后面。如果
src
中前
n
个字符没有出现
'\0'
,则取前
n
个字符再加一个
'\0'
连接到
dest
后面,所以
strncat
总是保证
dest
缓冲区以
'\0'
结尾。

5、比较字符串

int memcmp(const void *s1, const void *s2, size_t n);

说明:

memcmp
从前到后逐个比较缓冲区
s1
s2
的前
n
个字节(不管里面有没有
'\0'
),如果
s1
s2
的前
n
个字节全都一样就返回0,如果遇到不一样的字节,
s1
的字节比
s2
小就返回负值,
s1
的字节比
s2
大就返回正值。

int strcmp(const char *s1, const char *s2);

strcmp
s1
s2
当字符串比较,在其中一个字符串中遇到
'\0'
时结束,按照上面的比较准则,
"ABC"
"abc"
小,
"ABCD"
"ABC"
大,
"123A9"
"123B2"
小。

int strncmp(const char *s1, const char *s2, size_t n);

strncmp
的比较结束条件是:要么在其中一个字符串中遇到
'\0'
结束(类似于
strcmp
),要么比较完
n
个字符结束(类似于
memcmp
)。

6、搜索字符串

char *strchr(const char *s, int c);

char *strrchr(const char *s, int c);

返回值:如果找到字符c,返回字符串s中指向字符c的指针,如果找不到就返回NULL

说明:strchr
在字符串
s
中从前到后查找字符
c
,找到字符
c
第一次出现的位置时就返回,返回值指向这个位置,如果找不到字符
c
就返回
NULL
strrchr
strchr
类似,但是从右向左找字符
c
,找到字符
c
第一次出现的位置就返回。

char *strstr(const char *haystack, const char *needle);

返回值:如果找到子串,返回值指向子串的开头,如果找不到就返回NULL

说明:
strstr
在一个长字符串中从前到后找一个子串(Substring),找到子串第一次出现的位置就返回,返回值指向子串的开头,如果找不到就返回NULL。

7、分割字符串

char *strtok(char *str, const char *delim);

char *strtok_r(char *str, const char *delim, char **saveptr);

返回值:返回指向下一个Token的指针,如果没有下一个Token了就返回NULL

说明:
delim
是分隔符,可以指定一个或多个分隔符,
strtok
遇到其中任何一个分隔符就会分割字符串。第一次调用要把字符串首地址传给
strtok
的第一个参数,以后每次调用第一个参数只要传
NULL
就可以了,
strtok
函数自己会记住上次处理到字符串的什么位置(显然这是通过
strtok
函数中的一个静态指针变量记住的)。

strtok_r
函数则不存在这个问题,它的内部没有静态变量,调用者需要自己分配一个指针变量来维护字符串中的当前处理位置,每次调用时把这个指针变量的地址传给
strtok_r
的第三个参数,告诉
strtok_r
从哪里开始处理,
strtok_r
返回时再把新的处理位置写回到这个指针变量中(这是一个Value-result参数)。
strtok_r
末尾的r就表示可重入(Reentrant)。

char * strsep(char **s1, const char *delimt);

说明: 被分割字串要被改变,所以不能操作存放在静态存储区的字串常量,分割符要被替换成’\0’,需要传二级指针,因为s1是指向分割字串,第一次指向源字串,调用后指向分割后的下一个token。所以s1会改变,需要传递二级指针。

其他相关函数见http://see.xidian.edu.cn/cpp/u/hs2/

函数名: stpcpy

功 能: 拷贝一个字符串到另一个

用 法: char *stpcpy(char *destin, char *source);

函数名: strcat

功 能: 字符串拼接函数

用 法: char *strcat(char *destin, char *source);

函数名: strchr

功 能: 在一个串中查找给定字符的第一个匹配之处\

用 法: char *strchr(char *str, char c);

函数名: strcmp

功 能: 串比较

用 法: int strcmp(char *str1, char *str2);

根据ASCII码比较,str1>str2,返回值 > 0;两串相等,返回0

函数名: strncmpi

功 能: 将一个串中的一部分与另一个串比较, 不管大小写

用 法: int strncmpi(char *str1, char *str2, unsigned maxlen);

函数名: strcpy

功 能: 串拷贝

用 法: char *strcpy(char *str1, char *str2);

函数名: strcspn

功 能: 在串中查找第一个给定字符集内容的段

用 法: int strcspn(char *str1, char *str2);

函数名: strdup

功 能: 将串拷贝到新建的位置处

用 法: char *strdup(char *str);

函数名: stricmp

功 能: 以大小写不敏感方式比较两个串

用 法: int stricmp(char *str1, char *str2);

函数名: strerror

功 能: 返回指向错误信息字符串的指针

用 法: char *strerror(int errnum);

函数名: strcmpi

功 能: 将一个串与另一个比较, 不管大小写

用 法: int strcmpi(char *str1, char *str2);

函数名: strncmp

功 能: 串比较

用 法: int strncmp(char *str1, char *str2, int maxlen);

函数名: strcmpi

功 能: 把串中的一部分与另一串中的一部分比较, 不管大小写

用 法: int strcmpi(char *str1, char *str2);

函数名: strncpy

功 能: 串拷贝

用 法: char *strncpy(char *destin, char *source, int maxlen);

函数名: strnicmp

功 能: 不注重大小写地比较两个串

用 法: int strnicmp(char *str1, char *str2, unsigned maxlen);

程序例:

函数名: strnset

功 能: 将一个串中的所有字符都设为指定字符

用 法: char *strnset(char *str, char ch, unsigned n);

函数名: strpbrk

功 能: 在串中查找给定字符集中的字符

用 法: char *strpbrk(char *str1, char *str2);

函数名: strrchr

功 能: 在串中查找指定字符的最后一个出现

用 法: char *strrchr(char *str, char c);

函数名: strrev

功 能: 串倒转

用 法: char *strrev(char *str);

函数名: strset

功 能: 将一个串中的所有字符都设为指定字符

用 法: char *strset(char *str, char c);

函数名: strspn

功 能: 在串中查找指定字符集的子集的第一次出现

用 法: int strspn(char *str1, char *str2);

函数名: strstr

功 能: 在串中查找指定字符串的第一次出现

用 法: char *strstr(char *str1, char *str2);

函数名: strtod

功 能: 将字符串转换为double型值

用 法: double strtod(char *str, char **endptr);

函数名: strtok

功 能: 查找由在第二个串中指定的分界符分隔开的单词

用 法: char *strtok(char *str1, char *str2);

函数名: strtol

功 能: 将串转换为长整数

用 法: long strtol(char *str, char **endptr, int base);

函数名: strupr

功 能: 将串中的小写字母转换为大写字母

用 法: char *strupr(char *str);

函数名: swab

功 能: 交换字节

用 法: void swab (char *from, char *to, int nbytes);

http://www.yuanma.org/data/2006/1029/article_1738.htm

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: