2008-06-15

C中的字符串处理

C的标准库中提供了大量的字符串处理函数,我们先从功能分类来看看它们:

字符串长度:
原型:
size_t strlen(char const *string);
size_t是在stddef.h中定义的无符号整型。

不受限制的字符串函数:
 即之经过最后的\0来判断字符串长度
 原型:
 复制字符串:
 char *strcpy(char *dst,char const *src);
 从src处将字符串复制到dst中,返回dst的一份拷贝,即指向dst指向的内存空间的指针
 连接字符串:
 char *strcat(char *dst,char const *src);
 注意dst原先需要包含一个字符串,可以是空串,返回dst的一份拷贝,即指向dst指向的内存空间的指针
 字符串比较:
 int strcmp(char const *s1,char const *s2);
 逐字符比较,第一个不匹配的字符中较小的那个所在的字符串被认为较小,若一个字符串是另一个的子字符串则认为前者较小。
 若第一个参数小于第二个,返回一个小于零的值,相等则返回零。


长度受限的字符串函数:
 char *strncpy(char *dst,char const *src,size_t len);
 char *strncat(char *dst,char const *src,size_t len);
 int strncmp(char const *s1,char const *s2,size_t len);

 strncpy只向dst写入len个字符,若src长度小于len就用\0填满。strncat向dst中复制len个字符加一个\0,

字符串查找:

 char *strchr(char const *str,int ch);
 char *strrchr(char const *str,int ch);
 strchr在str中查找ch第一次出现的位置,而后返回指向该位置的指针。如果没有找到则返回NULL执政,strrchr返回str中ch最后出现的位置。

 char *strpbrk(char const *str,char const *group);
 strpbrk在str中查找group中任何一个字符在str中第一个出现的位置,返回指向该位置的指针。
 char *strstr(char const *s1,char const *s2);
 在s1中查找整个s2出现的位置,并方会指向该位置的指针,若s2并没有完整的出现在s1中就返回一个NULL指针,若s2为空则返回s1。

高级字符串查找:
size_t strspn(char const *str,char const *group);
 size_t strcspn(char const *str,char const *group);
 strspn返回str中起始部分中包含group中任何字符的个数,注意是从str的第一个位置开始计数,知道发现第一个不属于group中的字符位置。
 strcspn正好相反,返回的是str中起始部分不包含在group中的任何字符的个数。
 如
int len1,len2;
char test[]="12895424,1238539,3.5399sfdsfdsf";
 
len1=strspn(test,"123456789");
len2=strcspn(test,"456789");

 len1的值是8,len2的值是2。

分段提取字符串:
有时候需要从一个字符串中提取一些由各种可能的符号分割的参数,这个时候就要用strtok了
char *strtok(char *str,char const *sep);
spe定义了分隔字符的集合,str指定被分隔的字符串,每次运行strtok时都会找到str中下一个分隔标记,并且保存在标记的位置,并用\0结尾被分割的前面部分,并返回前面被分割的那个部分的起始位置的指针,如果str是一个NULL指针,这strtok从前面被保存的位置开始继续查找,直到不再有标记时返回NULL。下面这个例子可以看看:

#include <stdio.h&rt;

#include<string.h&rt;

int main()
{
char spee[]=" \t\f\r\v";
char strf[]="tesr dfidjf tesfi .df",*rest;

for(rest=strtok(strf,spee);rest!=NULL;rest=strtok(NULL,spee))
{
printf("next token is %s \n",rest);
}
}

运行结果是

next token is tesr
next token is dfidjf
next token is tesfi
next token is .df

以上就是字符串的操作了,接下来是字符操作:

字符分类:
用于分辨是否是某种字符:包括下面这些函数,全部都是形如:int isupper(int ch);

函数
若符合以下条件则返回真 
iscntrl 任何控制字符
isspace 任何空白字符' ','\f','\n','\r','\t','\v'
isdigit
十进制0-9
isxdigit
十六进制数0-9,a-f,A-F
islower
小写字母
isupper
大写字母
isalpha
字母
isalnum
字幕或数字
ispunct
标点符号,以及不属于字母或数字的图信字符
isgraph任何图形字符
isprint
任何可打印字符

字幕转换:
int tolower(int ch);
int toupper(int ch);


内存操作:
如果要处理一些非字符串数据的时候可以使用,情况于字符串处理类似,所以放在一起。

void *memcpy(void *dst,void const *srt,size_t length);
void *memmove(void *dst,void const *srt,size_t length);
void *memcmp(void const *a,void const *b,size_t length);
void *memchr(void const *a,int ch,size_t length);
void *memset(void *a,int ch,size_t length);

length表示要处理的字节数,memcpy从src复制lenght个字节到dst,不允许dst和src有重叠,memmove和memcpy类似,只是允许dst和src重叠。
memchr从a的其实位置查找ch第一次出现的位置并返回指向该位置的指针,
memset用ch覆盖a的前length个长度。

没有评论: