C语言字符串函数

求字符串长度

strlen()

strlen函数----求字符串长度的函数
一般形式:

strlen(字符数组)

头文件:

#include <string.h>

函数原型:

size_t strlen(const char* str);

‘\0’ 字符串结束标志.
str指向的字符串必须要以’\0’结束.
strlen()返回的是’\0’前面出现的字符个数(不包括’\0’).
strlen()函数返回值是size_t,是无符号的(注意:无符号数-无符号数=无符号数)
看下面代码:

#include <stdio.h>
#include <string.h>
int main()
{
	if (strlen("hyj") - strlen("dhfjrb") > 0)
		printf("hahaha\n");
	else
		printf("hehehe\n");
	return 0;
}
//此时打印的是:hahaha

strlen函数模拟实现

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

strcpy()

strcpy函数----字符串复制(拷贝)函数
一般形式:

strcpy(字符数组1,字符串2)
//"字符串2"可以是字符数组名,也可以是一个字符串常量

作用:将字符串2复制到字符数组1中去
头文件:

#include <string.h>

函数原型:

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

source指向的字符串必须以’\0’结束
strcpy也会将source指向的字符串中的’\0’拷贝到目标空间
目标空间必须足够大,以便容纳被复制的字符串
目标空间必须可变
返回值:返回的是目标空间的起始地址

#include <stdio.h>
#include <string.h>
int main()
{
	char str[30] = "helloword";
	char arr[] = "china";
	strcpy(str, arr);
	printf("%s\n", str);//china
	return 0;
}

strcpy函数模拟实现

strcat()

strcat函数----字符串连接函数
一般形式:

strcat(字符数组1,字符数组2)

作用:把两个字符数组中的字符串连接起来,把字符串2连接到字符串1的后面,结果放在字符数组1
函数调用后得到一个函数值-----字符数组1的地址
连接时将字符串1后面的’\0’取消(从’\0’从开始连接),最后在新字符串后面保留’\0’;
头文件:

#include <string.h>

函数原型:

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

source指向的字符串必须以’\0’结束
目标空间必须足够大,以便容纳连接后的新字符串
目标空间必须可修改
字符串不能自己给自己追加(即不能自己连接自己:strcat(arr,arr);arr是一个已定义的数组)
strcat函数模拟实现

strcmp()

strcmp函数----字符串比较函数
一般形式:

strcmp(字符串1,字符串2)

字符串的比较规则是:将两个字符串自左至右逐个字符比较(按照ASCII值大小比较),直到遇到不同的字符或’\0’为止
头文件:

#include <string.h>

函数原型:

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

如果第一个字符串大于第二个字符串,则返回大于0的数字
如果第一个字符串小于第二个字符串,则返回小于0的数字
如果第一个字符串等于第二个字符串,则返回0
strcmp函数模拟实现

长度受限制的字符串函数

strncpy()

strncpy(字符数组1,字符串2,n)

strncpy函数----将字符串2中前面n个字符复制到字符数组1中去
函数原型:

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

从源字符串拷贝n个字符到目标空间
如果源字符串的长度小于n,则拷贝完字符串之后,在目标的后面追加0(即’\0’),直到n个

strncpy(str1,str2,2)

作用:将str2中前面2个字符复制到str1中,取代str1中原有的最前面2个字符.
但复制的字符个数n不应多于str1中原有的字符(不包括’\0’).

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[15]="abcdefghgij"
	char str2[]="china";
	strncpy(str1,str2,8);
	//因为str2中的字符串长度小于8,则拷贝完字符串之后,在目标的后面追加0(即'\0'),直到8个
	printf("%s\n",str1);//china
	return 0;
}

执行后,str1的状态如下:
c h i n a \0 \0 \0 g i j
strncpy函数模拟实现

strncat()

strncat(字符数组1,字符串2,n)

strncat函数----将字符串2中前面n个字符追加到字符数组1中(从第一个’\0’开始往后追加)去
函数原型:

char* strncat(char* destination,const char* source,size_t num);
#include <stdio.h>
#include <string.h>
int main()
{
	char str1[30]="hello\0*******";
	char str2[]="china";
	strncat(str1,str2,3);
	printf("%s\n",str1);//hellochi
	return 0;
}

执行后,str1的状态如下:
h e l l o c h i \0 * * * * * * *
由此可以看出:strncat()函数是从第一个’\0’处开始追加的,最后再在追加完后的新字符串后面加个’\0’
strncat函数模拟实现

strncmp()

strncmp(str1,str2,n)

str1和str2为要比较的字符串,n为str1和str2比较的字符数
函数原型:

int strncmp(const char* str1,const char* str2,size_t n);
#include <stdio.h>
#include <string.h>
int main()
{
	char str1[] = "hello world";
	char str2[] = "hello hyj";
	int ret1= strncmp(str1, str2, 5);
	int ret2 = strncmp(str1, str2, 6);
	int ret3 = strncmp(str1, str2,7);
	printf("%d %d %d\n", ret1,ret2,ret3);// 0 0 1
	return 0;
}

strncmp函数模拟实现

字符串查找

strstr()

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL(空指针)。
头文件:

#include <string.h>

函数原型:

char* strstr(const char* str1, const char* str2);
#include <stdio.h>
#include <string.h>
int main()
{
	const char* str1 = "helloworld";
	const char* str2 = "world";
	const char* str3 = "china";
	char* ret1 =(char*)strstr(str1, str2);
	//因为str1的类型是const char*,所以函数返回值的类型也是const char*,所以需要强制类型转换
	//ret1存放的是w的地址
	const char* ret2 = strstr(str1,str3);
	printf("%s\n%s\n", ret1, ret2);
	return 0;
	return 0;
}
//输出:
world
(null)

strstr函数模拟实现

strchr()

strchr(str,c) 函数用于判断字符c是否在字符串str1中。如果在,则该函数返回c在str中第一次出现的地址;否则,返回NULL(空指针)。
头文件:

#include <string.h>

函数原型:

char* strchr(const char* str,char c);
#include <stdio.h>
#include <string.h>
int main()
{	
	const char* str = "How Do You Do?";
	char c1 = 'o', c2 = 'a';
	const char* ret1 = strchr(str, c1);
	const char* ret2 = strchr(str, c2);
	printf("%s\n%s\n", ret1, ret2);
	return 0;
}
输出:
ow Do You Do?
(null)

strchr()函数模拟实现

字符串分割

strtok()

strtok函数----字符串切割函数
头文件:

#include <string.h>

函数原型:

char* strtok(char* str1 ,const char* str2);

参数str2是一个字符串,定义了用作分隔符的字符集合
str1指向一个欲分割的字符串,它包含了0个或多个(str2字符串中一个或多个分隔符)分割的标记
strtok函数会改变被操作的字符串,所以在使用strtok函数切割的字符串一般都是临时拷贝的内容并且可修改
当strtok函数在参数str1的字符串中发现str2中所包含的分隔符时则会将其分隔符改为’\0’,并返回一个指向被分割出的部分的指针
第一次调用strtok()函数时,必须给予参数str1字符串,在以后的每次调用则须用NULL(空指针)来替换str1
因为当strtok()的第一个参数不为NULL(空指针)时,函数将找到str1中第一个分隔符,strtok函数将会保存它在字符串str1中的位置
当strtok()的第一个参数为NULL(空指针)时,函数将在字符串str1中被保存的位置开始,查找下一个分隔符
当没有被分割的串时则返回NULL

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[] = "Life,depends/on luck";
	const char* str2 = ",/ ";//注意/后面还有一个空格字符
	char* ret1 = strtok(str1, str2);
	printf("%s\n", ret1);
	char* ret2 = strtok(NULL, str2);
	printf("%s\n", ret2);
	char* ret3 = strtok(NULL, str2);
	printf("%s\n", ret3);
	char* ret4 = strtok(NULL, str2);
	printf("%s\n", ret4);
	printf("%s\n", str1);//注意此时str1数组的内容改变了
	return 0;
}
输出:
Life
depends
on
luck
life

若在运行上面这个程序时出现以下错误:
错误 1 error C4996: ‘strtok’: This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\users\就到这吧\documents\visual studio 2013\projects\project3\project3\c.003.cpp 64 1 Project3
你可以在此文件的开头加上:

#define _CRT_SECURE_NO_WARNINGS 1

或者将strtok()函数改为strtok_s()

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char str1[] = "Life,depends/not*on luck";
	const char* str2 = ",/ *";
	char str1_cpy[30] = { 0 };
	strcpy(str1_cpy, str1);
	char* ret = NULL;
	for (ret = strtok(str1_cpy, str2); ret; ret = strtok(NULL, str2))//判断条件也可以写成ret!=NULL;
	{
		printf("%s\n", ret);
	}
	return 0;
}
输出:
Life
depends
not
on
luck
#include <stdio.h>
int main()
{	
	int a = 0;
	char b = '\0';
	char* c = NULL;
	if (a == b && a == (int)c && b == (char)c)
		printf("haha\n");
	else
		printf("hehe\n");
	return 0;
}
//输出:
haha

错误信息报告

strerror()

函数原型:

char* strerror(int errnum);

返回值:返回错误码对应的错误信息
头文件:

#include <string.h>
#include <stdio.h>
#include <string.h>
int main()
{
	char* str = strerror(1);
	printf("%s\n", str);//Operation not permitted
	return 0;
}
//错误码   错误信息
	0		No error
	1		Operation not permitted
	2		No such file or directory
	3		No such process
	4		Interrupted function call
   ...		...

strerror()函数还有一个用法,如下:

char* str=strerror(errno);

errno是一个全局的错误码的变量
当库函数在执行过程中发生了错误,此时就会把对应的错误码赋值给errno
必须要包含的头文件:

#include <errno.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
int main()
{
	FILE* pfile = fopen("hyj.text", "r");
	if (pfile == NULL)
		printf("%s\n", strerror(errno));
	else
		printf("open file success\n");
	return 0;
}
若你当前文件所在的文件夹的里面没有hyj.text文件,则会打印:
No such file or directory
否则打印:
open file success

字符串大小写转换函数

strlwr()

strlwr函数----转换为小写的函数
一般形式:

strlwr(字符串)

函数作用:将字符串中的大写字母换成小写字母
注意:只转换字符串中的大写字母,不改变其它字符
头文件:

#include <string.h>

函数原型:

char* strlwr(char* str);

返回值:返回转换后的字符串的地址

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "How Do You Do?";
	char* ret = strlwr(str);
	printf("%s\n%s\n", ret, str);
	return 0;
}
输出:
how do you do?
how do you do?

strupr()

strupr函数----转换为大写的函数
一般形式:

strupr(字符串)

函数作用:将字符串中的小写字母换成大写字母
注意:只转换字符串中的小写字母,不改变其它字符
头文件:

#include <string.h>

函数原型:

char* strupr(char* str);

返回值:返回转换后的字符串的地址

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "How Do You Do?";
	char* ret = strupr(str);
	printf("%s\n%s\n", ret, str);
	return 0;
}
输出:
HOW DO YOU DO?
HOW DO YOU DO?
  • 9
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值