需要注意的一些知识点
字符串:一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。
字符串长度:所包含的字符个数(不包括NUL字节)。
无符号数在使用时需要特别注意:
如:
if( strlen( x ) >= strlen( y ) )...
if( strlen( x ) - strlen( y ) >= 0 )...
其中第一条语句可以按照预想的那样工作,但是第二条语句结果永远是真。
(说明:strlen返回size_t类型)
基础函数char *strlen( char const *string );
char *strcpy( char *dst, char const *src );
char *strcat( char *dst, char const *src );
int strcmp( char const *s1, char const *s2 );
注意:strcpy,strcat不保证返回的是一个合法的字符串,程序员必须自己保证dst能够容纳字符串。
长度受限字符串函数
char *strncpy(char *dst, char const *src, size_t len );
(src < dst ,将会以NUL填充到len长度,若src>dst,结果不会以NUL字节结尾)
char *strncat( char *dst, char const *src, size_t len);
(最多向dst中复制len个字符,并以NUL字节结尾,但不管复制后长度是否溢出,需程序员字节保证)
int strncmp( char const *s1, char const *s2, size_t len );
内存操作
void *memcpy( void *dst, void const *src, size_t length );
void *memmove( void *dst, void const *src, 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 );
字符操作:使用字符操作函数能提高程序的可移植性。
字符分类函数
iscntrl 任何控制字符
isspace 空白字符:空格' ', 换页'\f', 换行'\n', 回车'\r', 制表符'\t', 垂直制表符'\v'
isdigit 十进制数字0~9
isxdigit 十六进制数字,0~9 a~f A~F
islower 小写字母a~z
isupper 大写字母A~Z
isalpha a~z A~Z
isalnum 字母或数字 a~z A~Z 0~9
ispunct 标点符号,任何不属于数字或字母的图形字符(可打印符号)
isgraph 任何图形字符
isprint 任何可打印字符,包括图形字符和空白字符
字符转换
int tolower( int ch );
int toupper( int ch );
注意:如果函数的参数并不是处于适当大小写状态的字符(即toupper的参数不是小写字母或tolower的参数不是大写字母),函数将不修改参数直接返回。
高级函数
1.查找一个字符/*
**返回指向第一个在str中出现的ch的位置的指针。
*/
char *strchr( char const *str, int ch );
例:
1 char string[20] = "Hello there, honey.";
2 char *ans;
3 ans = strchr( string, 'h' );
结果:ans = string+7;
/*
**返回指向最后一个在str中出现的ch的位置的指针。
*/
char *strrchr( char const *str, int ch );
2.查找任何几个字符/*
**返回指向str中第一个匹配group中任何字符的字符位置。
*/
char *strpbrk( char const *str, char const *group );
例:
1 char string[20] = "Hello there, honey.";
2 char *ans;
3 ans = strpbrk( string, "aeiou" );
结果:ans=string+1;
3.查找一个子串/*
**返回s2在s1中第一次出现的起始位置的指针。
**如果s2在s1中没有出现,返回NULL。
**如果s2为空字符串,返回s1。
*/
char *strstr( char const *s1, char const *s2 );
注意:不存在strstr或strrpbrk函数。
但是可以很容易实现,如:
查找子串最右一次出现的位置4.查找一个字符串前缀/*
**返回str起始部分匹配group中任意字符的字符数。
*/
size_t strspn( char const *str, char const *group );
例:
1 int len1,len2;
2 char buffer[] = "25,142,330,Smith,j,239-4132";
3
4 len1 = strspn( buffer, "0123456789");
5 len2 = strspn( buffer, ",0123456789");
结果:len1 = 2;
len2 = 11;
例2:
//计算一个指向字符串中第一个非空白字符的指针。
ptr = buffer + strspn( buffer, "\n\r\f\t\v" );
/*
**返回str起始部分不与group中任意字符匹配的字符数。
*/
size_t strcspn( char const *str, char cosnt *group );
5.查找标记/*
**实现从字符串str中隔离(提取)各个单独的称为token的部分,并丢弃分隔符(在sep中出现的字符)。
*/
char *strtok( char *str, char const *sep );
例:
print_tokens.c
1 /*
2 **从一个字符数组中提取空白字符分隔的token
3 **并把他们打印出来(每行一个)。
4 */
5 #include< stdio.h >
6 #include< string.h >
7
8 void
9 print_tokens( char *line )
10 {
11 static char whitespace[] = "\t\f\r\v\n";
12 char *token;
13
14 for( token = strtok( line, whitespace );
15 token != NULL;
16 token = token( NULL, whitespace ))
17 printf( "Next token is %s\n", token );
18 }
19