字符函数和字符串函数

求字符串长度
size_t strlen(const char *str);
str指向的字符串必须以’\0’结束,strlen函数返回的数值并不包含’\0’。
还需要注意的是strlen 的返回值是size_t,是无符号的整型。

int main()
{
	const char str1 = “abcdef”;
	const char str2 = “hijk”;
	if(strlen(str2) – strlen(str1) > 0)
		printf(“str2 long\n”);//输出的是此语句,因为是无符号数,而且有符号数和无符号数做运算后最终结果是无符号类型。
 									//if((signed)0 - (unsigned)1)这个条件是成立的
	else
		printf(“str1 long or eq\n”);
	return 0;
}

长度不受限制的字符串函数

1、

char *strcpy(char *destination, const char *source);

源字符串 source 必须以’\0’结束(否则就会一直拷贝)。并会将源字符串中的’\0’拷贝到目标空间
目标空间必须足够大(否则就会出现越界),以确保能存放源字符串。
返回的是目标字符串的首元素地址。
2、

char *strcat(char *destination, const char *source);

拼接函数,其实,也是一种拷贝,也会把源字符串中的’\0’拷贝到目标空间
源字符串必须以’\0’结束,而且目标字符串也必须以’\0’结束(从destination字符串的‘\0’处开始拷贝源字符串)。
目标空间必须足够大(否则就会出现越界)。
返回的是目标字符串的首元素地址。

char buf[32] = “abcd”;
strcat(buf, buf);//直接自己给自己拼接?这是不可以的,因为会把’\0’覆盖掉,而且字符串还会越来越长。
                        //解决方法是char buf1[32] = “abcd”; strcat(buf, buf1);

3、

int strcmp(const char *str1, const char *str2);

标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字;
等于的话,则返回0;
小于的话,则返回大于0的数字。
而确切数值是依赖不同的C实现的。
**一般来说,返回值会是:1 0 -1,**有时会把两个字符的ASCII码之差作为比较结果由函数的返回值带回。

长度受限制的字符串函数

1、

char *strncpy(char *destination, const char *source, size_t num);

如果源字符串的长度小于num,则拷贝完源字符串后,在目标的后边追加0,直到num个。
如果source大于num,则不会在目标末尾隐式附加空字符。

const char *msg = “abcdef”;
char buf[32];
strncpy(buf, msg, strlen(msg));//**此时buf中是没有’\0’的**
所以应该strncpy(buf, msg, strlen(msg)+1); 
所以,num大了不怕(而且destination的空间也要足够大),就怕小了。

2、

char *strncat(char *destination, const char *source, size_t num);

将source的前num个字符追加到destination,再加上一个终止的空字符。
如果source中的C字符串的长度小于num,则仅复制直到终止空字符的内容。

注意和strncpy的不同。

const char *msg = “abcdef”;
char buf[32];
strncpy(buf, msg, strlen(msg)+1);
strncat(buf, msg, 3);//**buf中是有’\0’的**
strncat(buf, buf, strlen(buf));//这种方式是可以自己给自己拼接的,因为这并不会无限拷贝下去。

3、

int strncmp(const char *str1, const char *str2, size_t num);

比较到出现一个字符不一样,或者一个字符串结束,再或者num个字符全部比较完。

字符串查找

1、

char *strchr(const char *, int);//找第一个在目标字符串中出现我们要的字符,并把这个字符的地址返回。

2、

char *strrchr(const char *, int);// 找最后一个在目标字符串中出现我们要的字符,并把这个字符的地址返回。

3、

char *strpbrk(const char *, const char *);//返回第一个字符串中 第一个出现在第二个字符串中的字符的 地址。

4、

char *strstr(const char *str1, const char *str2);//在str1中找str2,返回第一次出现。

char str[] = “This is a simple string”;
char *pch = strstr(str, “simple”);
strncpy(pch, “sample”, 6);
puts(str);//输出的是This is a sample string

高级字符串查找

1、

size_t strspn(const char *str1, const char *str2);
//看str1中的字符是否在str2中,有一个在就+1(不包括’\0’),一旦str1中出现一个字符不在str2中,函数结束,并返回总数。 

在这里插入图片描述
2、

size_t strcspn(const char *str1, const char *str2);// 看str1中的字符是否不在str2中,有一个不在就+1,一旦str1中出现一个字符在str2中,函数结束,并返回总数。

3、

char *strtok(char *str, const char *sep);//将一个字符串分割成多个字符串

注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。
第一个参数就是我们要切分的字符串;
第二个参数这里面其实描述了分隔符是什么。
strtok它支持多个分隔符
它的返回结果等于NULL,说明切分完了。
如果没等于空指针,那说明切分出了第一部分。
调用一次,只给你切出一个部分来。

举例ls -l /
第一次调用返回结果:指向l的指针,同时会把s后面的空格(第一个空格)设置为’\0’。
再来一次调用,但是注意第一个参数传的是NULL,如果传个str会怎样?还是从l的开始进行切分,但是由于你已经把ls作为一个单独的字符串了,你再尝试对它按空格切分,啥都没有啊!并没有把后面的部分切分出来。
第二次调用的时候参数要填NULL(所以strtok内部一定有static的局部变量,还有就是static只初始化一次,而且生命周期随进程,而且还只在本函数内部有效),表示根据上次切分的结果然后决定这次从哪个位置继续切分。而上次切分后的’\0’的这个位置会被strtok自动记录下来,于是你第二次再调用的时候,如果你这里面传了一个NULL,那么,我们就可以说沿着上次记录的\0继续往后切分,不就能够把这里的"-l"给你切分出来了嘛!第二次的返回结果就是指向-的指针了,并且把l后面的空格设置为’\0’。
第三次调用参数还是填NULL,返回的结果就是指向"/"的指针,并且把/后面的字符设置为’\0’。
第四次调用的时候,就会返回NULL。
切分之后,破坏了原有的字符串。
在这里插入图片描述

错误信息报告

1、

char *strerror(int errnum);//返回错误码所对应的错误信息。
//在C中,C库默认提供一个errno全局变量,默认正常情况下就是0,一旦调用C库函数失败,errno会被置成对应的错误码。

2、

void perror(const char *);//而perror就是把错误码解释为错误信息,并将其打印到stderr(标准错误流,通常指显示器)。
//如果perror的参数不是NULL,并且指向一个非空的字符串,那perror先打印这个字符串,然后跟着输出一个冒号和一个空格,接着输出错误信息,再跟’\n’。

其实,perror和strerror的功能类似,只不过strerror不具备打印的功能。
printf(“%s\n”, strerror(errno)); perror(NULL); perror(“”); 三者等价。

strlwr函数,转换为小写的函数
strupr函数,转换为大写的函数
int main()
{
	char a[] = "aBcD";
	printf("%s\n", strlwr(a));//输出abcd
	printf("%s\n", strupr(a));//输出ABCD
	return 0;
}

头文件<ctype.h>
1、int iscntrl(int c);//判断是否是控制字符
2、int isspace(int c);//判断是否是空格(空格、换行’\n’、水平制表符’\t’、 垂直制表符’\v’、回车’\r’、换页’\f’)
3、int isdight(int c);//判断是否是十进制数字‘0’~‘9’字符
4、int isxdight(int c);//判断是否是十六进制数字字符(‘0’…‘9’、‘a’…‘f’、‘A’…‘F’):
5、int isupper(int c);//判断是否是大写
6、int islower(int c);//判断是否是小写
7、int isalpha(int c);//判断是否为字母(‘A’…’Z’、‘a’…‘z’)
8、int isalnum(int c);//判断是否为数字‘0’…‘9’字符或字母(‘A’…’Z’、‘a’…‘z’)
9、int ispunct(int c);//判断是否为标点符号
//标准的“ C”语言环境将标点符号视为不是字母数字的所有图形字符(如isgraph)(如isalnum)。
10、int isgraph(int c);//检查c是否具有图形表示的字符
//具有图形表示的字符是除空格字符(’’)以外所有可以打印的字符(由isprint确定)。
11、int isprint(int c);//检查c是否为可打印字符
12、int toupper(int c);//转成大写,传入参数本身就是大写的话,不变。
13、int tolower(int c);//转成小写,传入参数本身就是小写的话,不变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值