"C语言-字符串、字符和字节操作"

  "C语言基础复习五"

Posted by Xu on January 18, 2018

字符串、字符和字节

str_ch_byte_operation

字符串的长度:字符串包涵的字符个数,利用函数strlen可以获得一个类型为size_t的长度值,size_t为一个类型为无符号整数类型

if(strlen(x) >= strlen(y))...//这里的判断可以按照我们得意愿来执行
if(strlen(x)-strlen(y)>=0)...//这里判定永远为真,因为是两个无符号数相减

不受限制的字符串函数

复制字符串:char *strcpy(char *dst,char const *src);//使用const定义指针形参表示src数据不可修改

  • 其中 dst必须是一个字符数组或一个指向动态分配内存的数组,拷贝的src字符会覆盖dst前面的内容,因为有”\0”字符做结尾,所以dst后面的字符会有效被删除。
  • 必须保证dst中字符数组空间可以容纳src字符串的长度,否则,src超出的部分依然会占据dst数组后面的内存空间,改写那里的数据

连接字符串:char *strcat(char *dst,cahr const *src);//将src字符串连接到dst字符串末位

  • 同理字符数组dst的内存大小必须可以容纳连接后的字符串

字符串复制和字符串连接的函数返回的都是指向新字符数组的指针。

字符串比较:int strcmp(char const *s1,char const *s2);s1<s2则返回一个小于零的值(不一定为-1),如果s1>s2则返回一个大于零的值(不一定为1),如果相等返回0

长度受限的字符串函数

对应“不受限制”的三个函数:

  1. char *strncpy(char *dst,char const *src,size_t len);//将src拷贝len个字符到dst中去,当src的长度不足len时,用”\0补充”,当src的长度多于len时,只截取len长度字符串,这样它的结尾将不以”\0”结尾

  2. char *strncat(char *dst,char const *src,size_t len);//将src中最多长度为len的字符串拷贝到dst末位,当src的长度不足len,不会补充,当src的长度多于len,只截取len长度字符串拷贝到dst,但最后会添加一个”\0”到字符串末位

  3. char *strncmp(char const *dst,char const *src,size_t len);//只对src和dst前len个字符进行比较

字符串查找基础

1. 查找一个字符

char *strchr(char const *str,int ch);//注意第二个参数是一个整型值,代表一个字符,该函数表示查找字符ch在str中的位置,并返回该字符所在位置的指针
char *strrchr(char const *str,int ch);//大致功能和strchr相同,但返回的是出现在str中最右边位置的指针

2. 查找任何几个字符

char *strpbrk(char const *str,char const *group);//ch由group替代,查找str中这一组字符group第一次出现的位置,并返回该位置指针

//如:
char string[20] = "Hello,there,honey";
char *ans;
ans = strpbrk(string,"aeiou");//返回string+1,因为返回的是aeiou这五个字符中第一次出现的位置,第一次出现字符e在string+1的位置

3. 查找一个子串

char *strstr (char const *s1,char const *s2);//该函数返回字符串s2在s1中第一次出现的位置指针,如果s2为空,则直接返回s1

高级字符串查找

1. 查找一个字符串前缀

size_t strspn(char const *str,char const *group);//返回str前面匹配group字符数组的任意字符个数(不在乎顺序)
size_t strcspn (char const *str,char const *group);//返回str前面不匹配group字符数组的任意字符个数

2. 查找标记

char *strtok(char *str,char const *sep);//查找并返回字符串str中,分隔符集合sep所分隔出来的标记指针,当str不为NULL时,返回第一个标记的指针,并保存该标记的位置,当str为NULL时,返回已经保存的标记位置的下一个标记的指针

不能同时使用strtok来解析两个字符串,因为strtok函数有它自己的局部变量

错误信息

操作系统通过设置一个外部的整型变量errno进行错误报告。strerror可以将错误编号作为参数并返回一个指向用于描述错误的字符串指针。

char *strerror(int error_number);

字符操作

标准库中包含来两组函数用于操作单独的字符,存放在头文件ctype.h。第一组函数用于对字符的分类,第二组函数用于对字符的转换

字符分类

判断字符类型:

iscntrl(控制字符),isspace(空格),isdigit(十进制),isxdigit(十六进制),islower(小写字母),isupper(大写字母),isalpha(字母),isalnum(字母或数字),ispunct(标点符号),isgraph(图形字符),isprint(可打印字符)。

字符转换

小写字符与大写字符转换

int tolower(int ch); int toupper(int ch);

内存操作

void *memcpy(void *dst,void const *src,size_t len);//以字节为单位进行拷贝
void *memmove(void *dst,void const *src,size_t len);//和memcpy类似,但允许重叠
void *memcmp(void const *a,void const *b,size_t len);//逐字节比较
void *memchr(void const *a,void const *b,size_t len);//寻找ch第一次出现的位置,只查找前len个字符
void *memset(void *a,int ch,size_t len);//把从a开始的len个字节均设置为ch