字符函数和字符串函数的运用

-------

-------------书似青山常乱叠 

-----------------------灯如红豆最相思

看此篇的你,一码当先,月薪过万!

目录

字符分类函数

字符转换函数

 字符串库函数的使用与模拟

strlen的使用和模拟实现

模拟实现strlen库函数:

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

strcpy的使用与模拟实现

 模拟实现strcpy库函数:

strcat的使用和模拟实现 

模拟实现strcat库函数: 

strcmp的使用和模拟实现

 模拟实现strcmp库函数:

长度受限制的字符串函数 

 strncpy函数的使用

 strncat函数的使用

 strncmp函数的使用

 strstr函数的使用 ​编辑

 strok函数的使用


字符分类函数

判断一个字符属于什么类型

下面函数,如果它的参数符合条件就返回真值(>0),需要被#include<ctype.h>包含

iscntrl:任何控制字符

isspace:空白字符

空格‘ ’,换页‘ \f ’,换行‘ \n ’,回车‘ \r ’,水平制表符' \t ',垂直制表符‘ \v ’;

isdigit:十进制数字0~9;

isdigit:十六进制数字,包括所有十进制数字小写字母a~f大写字母A~F;

islower:小写字母a~z;

isupper:大写字母A~Z;

isalpha:字母或数字

ispunct:标点符号

isgraph:任何图形字符

isprint:任何打印字符,包括图形字符和空白字符

 这些函数的使用方法十分类似,我们通过isupper来说明:

我们通过对sum的赋值来判断Hello World语句的输出

#include<stdio.h>
#include<ctype.h>
int main()
{
	char sum = 0;
	scanf_s("%c", &sum);
	if (isupper(sum))
	{
		printf("Hello World!");
	}
	return 0;
}

如果sum赋值的是大写字母返回非0值,结果为真执行语句

 

如果sum赋值的是其他字符就返回0,结果为假语句不执行

字符转换函数

1.tolower(char 字符):将大写字母转小写字母

2.toupper(char 字符):将小写字母转大写字母; 

#include <stdio.h>
#include <ctype.h>
int main()
{
	int i = 0;
	char arr[] = "Hello World!";
	char sum;
	while (arr[i])                 //当遇到'\0'的时候循环停止
	{
		sum = arr[i];
		if (isupper(sum))         //判断字符是否为大写字符
			sum = tolower(sum);   //将大写转换为小写
		putchar(sum);             //每次输出单个字符
		i++;
	}
	return 0;
}

 字符串库函数的使用与模拟

strlen的使用和模拟实现

size_t strlen ( const char * str );

1.strlen常被我们用来统计字符数组的长度,它是以'\0'为结束标志

2.strlen返回值是size_t是无符号的整形

3.strlen的使用需要包含#include<string>头文件

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abc";
	char arr2[] = { 'a','b','c' };
	char arr3[] = { 'a','b','c','\0' };
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));
	printf("%d\n", strlen(arr3));
	return 0;
}

我们来看以上代码的输出结果:

1.因为字符串的形式会在末尾自动补上'\0',所以arr1的大小是3;

2.因为arr2没有'\0',strlen会直到找到'\0'才停止,所以输出随机值;

3.arr3由于补上了'\0',所以strlen找到'\0'停止计算,输出长度为3;

模拟实现strlen库函数:

#include<stdio.h>
size_t my_strlen(char* arr)
{
	int count = 0;
	while (*arr)
	{
		count++;
		arr++;
	}
	return count;
}
int main()
{
	char arr[] = "Hello World!";
	size_t rs = my_strlen(arr);
	printf("%zd", rs);
	return 0;
}

 也可以用递归的方法实现:

#include<stdio.h>
int my_strlen(const char* arr)
{
	if (*arr)
		return 1 + my_strlen(arr + 1);
	else
		return 0;
}
int main()
{
	char arr[] = "Hello World!";
	size_t rs = my_strlen(arr);
	printf("%zd", rs);
	return 0;
}

 size_t:无返回值的整形的判断:

我们来判断以下代码的打印结果是:大于还是小于

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abc";
	char arr2[] = "abcdef";
	if (strlen(arr1) - strlen(arr2) > 0)
	{
		printf("大于\n");
	}
	else
	{
		printf("小于\n");
	}
	return 0;
}

 我们发现它执行的是大于语句,那么arr1的大小真的大于arr2吗?非也。

因为strlen是size_t无符号的整型

一个无符号的整型减去另一个无符号的整型结果依然还是无符号

if里面的结果就为真。

 我们只要给它强制类型转换一下就好啦!比如说转换成int型,这样就有符号了。

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

这一类的函数是不安全的,编译器会报警告,我们只要在第一位置加上以下代码就可以啦

#define _CRT_SECURE_NO_WARNINGS 1

strcpy的使用与模拟实现

 char* strcpy(char * destination, const char * source );
                   目标字符串             源字符串

1.常被我们用来拷贝字符串

2.源字符串必须以'\0'结束

3.会将源字符串的'\0'拷贝到目标空间

4.目标空间要确保足够大,以确保能存放源字符串

5.目标空间必须是可修改值

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[20] = { 0 };
	char arr3[20] = "******************";
	char arr2[] = "Hello World!";
	strcpy(arr1, arr2);
	strcpy(arr3, arr2);
	printf("%s\n", arr1);
	return 0;
}

 通过以上我们可以看到,源字符串的'\0'被拷贝到目标字符串

如果源字符串没有'\0',可能会将一些乱码拷贝给arr1

如果arr1的空间不够程序就会越界访问

 目标空间必须是可修改的字符串,像以下的常量字符串是不可修改的,所以程序会崩掉

 模拟实现strcpy库函数:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
char* my_strcpy(char* dest, char* src)
{                //取了两个数组的首地址
    char* ret = dest;     
	while (*src)          //当*scr是'\0'时,循环结束
	{
		*dest++ = *src++; 
		//也可以这么写:*dest = *src;
		//dest++;
		//src++;
	}
	*dest = *src;    //将'\0'拷贝到目标空间
return ret;
}
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "Hello World!";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

  

strcat的使用和模拟实现 

char * strcat ( char * destination, const char * source );
                   //目标字符串               备份字符串

具体操作就是将备份字符串拼接到目标字符串的末尾也就是'\0'的位置 

1.常被我们用来追加字符串

2.源字符串必须以'\0'结束

3.目标字符串也得有'\0',否则没办法知道从哪里开始

4.目标空间必须足够大,能容纳下源字符串的内容

5.目标字符串必须可修改

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "Hello ";
	char arr2[] = "World!";
	strcat(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

模拟实现strcat库函数: 

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
char* my_strcat(char* destination, const char* source)
{
	char* str = destination;
	while (*destination)
	{
		destination++;         //找到目标函数的末位置
	}
	while (*source)
	{
		*destination++ = *source++;
	}
	*destination = *source;
	return str;
}
int main()
{
	char arr1[20] = "Hello ";
	char arr2[] = "World!";
	my_strcat(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

strcmp的使用和模拟实现

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

1. 常用于比较字符串的大小

2.第一个字符串大于第二个字符串,则返回大于0的值

3.第一个字符串等于第二个字符串,则返回0

4.第一个字符串小于第二个字符串,则返回小于0的值

5.比较两个字符串对应位置上的字符ASCLL码值的大小来判断字符串的大小

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "abcdefgh";
	char arr2[] = "accdez";
	int rs = strcmp(arr1, arr2);
	printf("%d", rs);
	return 0;
}

通过返回结果我们可以看到arr1的大小是小于arr2的 

而且字符串比较的不是长度而是对应位置上的大小ASCLL大小

 模拟实现strcmp库函数:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int strcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	if (*str1 > *str2)
	{
		return 1;
	}
	else
	{
		return -1;
	}
}
int main()
{
	char arr1[] = "abcdefgh";
	char arr2[] = "accdez";
	int rs = strcmp(arr1, arr2);
	printf("%d", rs);
	return 0;
}

长度受限制的字符串函数 

 strncpy函数的使用

char * strncpy ( char * destination, const char * source, size_t num );
                     //目标字符串        源字符串           从源字符串最大拷贝的个数

1.拷贝源字符串的num个字符到目标字符串的空间(拷贝函数)

2.如果源字符串的长度小于num,则会在拷贝完源字符串后在目标字符串后面补'\0'直到num个字符为止

3.可以选择拷贝的内容

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "**************";
	char arr2[] = "Hello World!";
	strncpy(arr1, arr2+6, 6);
	printf("%s\n", arr1);
	return 0;
}

而且他只会根据num的大小来确定拷贝多少,不用特意追加'\0' 

 strncat函数的使用

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

1.将source指向字符串的前num个字符追加到目标字符串的末尾并再追加一个'\0'(追加函数)

2.如果source指向字符串的长度小于num的时候,只会将字符串中到'\0'的内容追加到目标字符串的末尾

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "World!!!";
	strncat(arr1,arr2,5);
	printf("%s\n", arr1);
	return 0;
}

 

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "****\0**********";
	char arr2[] = "Hello World!";
	strncat(arr1,arr2,4);
	printf("%s\n", arr1);
	return 0;
}

 我们可以看到追加过去的时候,再追加了一个'\0'

 strncmp函数的使用

int strncmp ( const char * str1, const char * str2, size_t num );
                                                   //比较前几个字符
/*
1. 常用于比较字符串的大小

2.第一个字符串大于第二个字符串,则返回大于0的值

3.第一个字符串等于第二个字符串,则返回0

4.第一个字符串小于第二个字符串,则返回小于0的值

5.比较两个字符串对应位置上的字符ASCLL码值的大小来判断字符串的大小
*/

 这样可以提高程序运行的效率

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "abcdefg";
	char arr2[] = "abcdzfg";
	int rs = strncmp(arr1,arr2,4);
	printf("%d\n", rs);
	return 0;
}

 strstr函数的使用 

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

1.函数返回字符串str2在字符串str1中第一次出现的位置(判断字符串是否存在)

2.字符串的匹配不包括'\0','\0'作为结束标志

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "abcdefg";
	char arr2[] = "abc";
	char* ret = strstr(arr1,arr2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到!\n");
	return 0;
}

 strok函数的使用

char * strtok ( char * str, const char * delimiters );
                                    //指向str字符串,定义分割符的集合

1.常被我们用来提取关键信息

2.比如说[email protected],如果被分隔符挡着我们很难提取关键信息,我们可以用strok函数找到str的下一个标记(分隔符),并将它用'\0'代替。我们就拿到了zhangsan这个关键信息,再返回一个指向这个分割符的指针以记入位置

3.如果strok的第一个参数为str,则函数会找到字符串中的第一个分隔符并保存它的位置

4.如果strok的第一个参数为NULL,则函数会在上次保存的位置查找下一个分隔符,并保存它的位置

5.如果字符串之后没有更多的分割符,就会返回NULL

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "[email protected]";
	char arr2[30] = { 0 };
	strcpy(arr2, arr1);
	const char* p = "@.";
	char* s = NULL;
	for (s = strtok(arr2, p); s != NULL; s = strtok(NULL, p))
	{
		printf("%s\n", s);
	}
	return 0;
}

根据以上的代码我们可以发现,关键信息被提出来了。 

我们今天就介绍到这里

感谢支持!

猜你喜欢

转载自blog.csdn.net/2301_79201049/article/details/134605500