字符串基础
字符串是一串零个或多个字符,并且以一个位模式为全0的NULL字节结尾。
- 字符串所包含的的字符内部不能出现NULL字节;
- NUL字节是字符串的终结符,但它并不是字符串的一部分,所以字符串的长度并不包含NULL字节;
字符串的长度
字符串的长度就是它所包含的字符个数,通常使用函数strlen来计算字符串的长度。
sizet_t strlen(char const *string);
size_t定义在stddef.h中,它是一个无符号整数类型。
在表达式中使用无符号数可能导致不必要的 结果,如下:
if(strlen(x) >= strlen(y))...
if(strlen(x) - strlen(y) >= 0)...
第二条语句永远为真,因为strlen(x)/strlen(y)的返回值都是无符号数,所以>=左边是无符号数,无符号数不可能小于零。
不受限制的字符串函数
最常用的字符串函数都是不受限制的,就是说它们只是通过寻找字符串参数结尾的NULL来判断呢它的长度。在使用这些函数时,必须要保证结果字符串不会溢出内存。
复制字符串
用于复制字符串常用的函数时strcpy,函数原型如下:
char *strcpy(char *dst,char *src);
- 函数strcpy把参数src字符串你复制到dest,如果src和dest的内存空间重合,其结果是未定义的;
- 由于dest参数将进行修改,所以它必须是一个字符数组或者指向一个动态分配内存的指针,不能是常量;
- 函数的返回值是是指向参数srcd的一份拷贝,就是指向目标数组的指针;
连接字符串
把一个字符连接到一个字符后面,可以使用strcat函数,其原型如下:
char *strcat(char *des,char *src);
- strcat函数要求des参数已经包含一个字符串(可以是空字符串);
- 函数strcat好到字符串des的末尾,并把src字符串拷贝到这个位置;
- 函数的返回值是是指向参数srcd的一份拷贝,就是指向目标数组的指针;
字符串的比较
比较字符串所使用的函数是strcmp,这个函数按字典顺序逐个比较字符,其原型如下:
int strcmp(char const *s1,char const *s2);
- 如果s1小于s2,返回一个小于零的值;
- 如果s1等于s2,返回值为零;
- s1大于s2,返回一个大于零的值;
长度受限制的字符串函数
标准库还包含了一些函数,这些函数接受一个显式的长度参数,用于限定金系能复制或比较的字符串的字符数,他们的原型如下:
char *strncpy(char *dst,char connst *src,size_t len);
char *strncat(char *dst,char connst *src,size_t len);
int strncmp(char const *s1,char const *s2,size_t len);
注意,在strncpy函数中:
- 如果len大于strlen(src),dst数组就用额外的NULL字节填充到len长度;
- 如果len小于strlen(src),那么只有len个字节被复制到dst中,但它的结果不以NULL结尾;
- strncat函数不同于函数strncpy,它从src中最多复制len个字符到dst中,但是strncat总是在结构后面添加一个NULL字节,不像strncpy对目标数组用NULL字节进行填充;
- strncmp函数在len个字符前存在不相等的字符,则停止比较,返回结果;
字符串查找基础
查找一个字符
在一个字符串中查找一个特定的字符最常使用的就是strchr和strrchr函数,其原型如下:
char *strstr(char const *str,int ch);
char *strstr(char const *str,innt ch);
- 函数的第二个参数式整型值,但是,它包含了一个字符型值;
- strchr函数在字符串src中查找ch第一次出现的位置;
- strrchr函数在字符串中查找ch最后一次出现的位置;
- 函数的返回值为指向字符出现位置的指针,没查找到返回NULL;
查找任何几个字符
查找任何一组字符第一次出现在字符串中的位置使用函数strpbrk,其原型如下:
char *strpbrk(char const *str,char cont *group);
- 函数返回一个指向str中第一个匹配group中任何一个字符的字符位置,如果未找到匹配的返回一个NULL指针;
- 函数区分大小写;
查找一个字符串
strstr函数用于查找一个字符串,其原型如下:
char *strstr(char const *s1,char const *s2);
- strstr函数在s1中查找整个s2第一次出现的位置,并返回一个指向该位置的指针;
- 如果s2并没有完整的出现在s1中,函数返回一个NULL指针;
- 如果s2是一个空字符串,函数返回s1;
错误信息
strerror函数把操作系统设置的外部整形变量error其中的一个作为参数并返回一个指向用于描述错误的字符串的指针,其原型如下:
char *strerror(int error_number);
字符操作
标准库包含了两组函数,用于操作单独的字符,他们的原位于ctype.h中,第一组用于字符分类/判断,第二组用于转换字符。
字符分类
函数 | 如果它的参数符合下列条件就返回为真 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符,空格 ' ',换页'\f',换行'\n',回车'\r',制表符/垂直制表符 '\t'/'v' |
isdigit | 数字0-9 |
isxdigit | 十六进制数字,数字0-9,小写字母a-f,大写字母A-F |
islower | 小写字母a-a |
isupper | 大写字母A-Z |
isalpha | 字母a-z,A-Z |
isalnum | 字母或数字,a-z或0-9 |
ispunct | 标点符号,任何不属于字母或数字的图形字符(可打印符号) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符或空白字符 |
字符转换
转化函数把大写字母转换成小写字母或小写字母转换成大写字母
int tolower(int ch);
int toupper(int ch);
- 函数tolower返回字符ch 对应的小写形式的整型值;
- 函数toupper返回字符ch 对应的大写形式的整型值;
- ch并不是处于一个适当的大小写状态,函数将不修改参数直接返回;
内存操作
当字符串中函含有NULL字符,此时将不能在使用字符串操作函数,内存操作函数将任意的字符串序列,包含字符串中含有NULL字符的字符串,它们的函数原型如下:
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 );
- 以上函数与字符串函数不同之处在于它们遇到NULL不会停止操作;
- memmove函数的src和dst的内存空间可以重合;
- memcmp函数对两端内存的内容进行比较,这些值将按照无符号字符诸字节比较,若用该函数比较非单字节的数据如整数或浮点数将出现不可预料的结果;
- memchr函数从a的起始位置开始查找字符ch第一次出现的位置,最多查找length个字节,如果在这length个字节中未找到,函数返回一个NULL指针;
- memset函数把a开始length个字节全部设置为字符值ch,如把buffer的前SIZE个字节都初始化为0:
memset(buffer,0,SIZE);
网友评论