字符串处理函数和字符操作(C语言)

1.strlen

strlen返回的是一个类型为size_t的值,它是一个无符号的整数类型,
因此在使用时须注意:

if(strlen(x)-strlen(y)>0)

这种使用方法将永远为真,因为无符号整数绝不可能为负数。

2.strcpy和strncpy

strcpy(char *dst, char const *src)
strncpy(char *dst,char const *src,size_t len)

将参数src的字符串复制到dst参数,有两种特别的情况。
1.dst字符串容量小于src字符串容量,即空间不足,strcpy函数无法判断目标字符串容量的长度,因此无法处理这种情况,多余的字符任然被复制,它们将覆盖数组后面的内存空间的值。(即只能复制部分)
2.dst字符串容量大于src字符串容量:

char massage[]="original message";
strcpy(message,"different");

此时数组将变成下内容(省略单引号):d,i,f,f,e,r,e,n,t,\0,e,s,s,a,g,e,\0
在打印时,肯定是"different"因为读取到’\0’时会自动停止,但数组的实际储存的方式也需要我们了解。
对于strncpy:
如果src的长度小于dst,这种情况 和上述的第二种情况一样,
反之src的长度大于dst,则只有dst个长度复制进去,且没有’\0’字符

3.strcat和strncat

strcat(char *dst,char *src)
strncat(char *dst,char *src,size_t len)

将src的字符串拷贝添加到dst字符串的末尾,和strcpy一样,函数是不会检查数组的储存空间是否足够的。
使用strncat时,会自动在结尾加上’\0’

4.strcmp和strncmp

int strcmp(char const *s1,char const*s2)
int strncmp(char const *s1,char const *s2,size_t len)

如果s1小于s2,函数返回一个小于0的值,大于返回一个大于0的值,等于返回0。
使用strncmp时,只会比较到len的长度

5.字符串查找

1.查找一个字符

char *strchr(char const *str,int ch);
char *strrchr(char const *str,int ch);

第一个strchr,查找ch第一次出现的位置
第二个strrchr,查找ch最后一次出现的位置
2.查找任何几个字符

char *strpbrk(char const *str,char const *group)

这个函数返回一个指向str中第一个匹配group中的任意一个字符的位置,未找到时返回NULL
3.查找一个子串

char *strstr(char const*s1,char const *s2)

在字符串s1中查找s2第一次出现的起始位置
4.查找一个字符串前缀

size_t strspen(char const *str,char const*group)
size_t strcspen(char const *str,char const *group)

gruop中指定一个或者多个字符,strspen返回str起始部分匹配group中的任意字符数
5.查找标记

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

sep参数是一个字符串,定义了用作分隔符的字符集合,有点像python中的spilt函数

void print_tokens(char *line)
{
	static char whitespace[]="\t\f\r\v\n";
	char *token;
	for (token=strtok(line,whitespace);token!=NULL;token=strtok(NULL,whitespace))
		printf("next token is %s\n",token);
}

strtok函数中第一个参数不是NULL时,函数找到字符串的第一个标记,strtok同时将保存它在字符串中的位置,如果第一个参数为NULL,函数就在同一个字符串中从被保存的位置开始寻找下一个对应的标记。
所以在例子中,token=strtok(NULL,whitespace) 为了从上一次结束的地方开始,否则将一直循环在第一个对应字符。

6.字符操作

int isalnum(int ch):检查字符是否为数字或字母
int isalpha(int ch):检查字符是否为字母 
int iscntrl(int ch):检查字符是否为控制字符:(八进制000~037以及177的字符) 
int isdigit(int ch):检查字符是否为十进制数字:(0~9) 
int isgraph(int ch):检查字符是否为图形字符
int isprint(int ch):检查字符是否为可打印的:(数字、字母、标点符号、空白字符) 
int ispunct(int ch):检查字符是否为标点符号
int isspace(int ch):检查字符是否为空白字符:(TAB、换行、垂直TAB、换页、回车、空格) 
int isupper(int ch):检查字符是否为大写字母:(A~Z) 
int islower(int ch):检查字符是否为小写的字母:(a~z) 
int isxdigit(int ch):检查字符是否为十六进制数字

字符转换

int tolower(int ch);  //转换为小写
int toupper(int ch);  //转换为大写
eg:
int main(){
	char a='a';
	char b=toupper(a);
	printf("%c",b);
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值