首页 > 其他分享 >字符函数与字符串函数

字符函数与字符串函数

时间:2024-03-22 20:31:41浏览次数:18  
标签:字符 函数 int str2 str1 char 字符串 include

目录

1.字符分类函数

1.1 isupper函数

1.2islower函数

2. 字符转换函数

3.strlen的使⽤和模拟实现

4.strcpy的使⽤和模拟实现

5.strcat的使⽤和模拟实现

6. strcmp的使⽤和模拟实现

7. strncpy函数的使⽤

8. strncat函数的使⽤

9. strncmp函数的使⽤

10. strstr的使⽤和模拟实现

11. strtok函数的使⽤

12. strerror函数的使⽤


1.字符分类函数

使用字符分类函数需要包含头文件<ctype.h>

字符串分类函数有很多种,我就着重介绍其中两个(其他的也都类似):

1.isupper函数    2.islower函数

1.1 isupper函数

int isupper(int c);

isupper函数作用是判断字符是否为大写,并返回值说明。

当该字符为大写,则返回非0值。若不是大写,则返回0。

#include<stdio.h>
#include<ctype.h>
int main()
{
	int ret1 = isupper('a');//判断字符'a'是否大写
	int ret2 = isupper('A');//判断字符'A'是否大写
	printf("isupper('a')=%d \nisupper('A')=%d\n",ret1,ret2);
	return 0;
}

1.2islower函数

int islower(int c);

islower函数作用是判断字符是否为小写,并返回值说明。

当该字符为小写,则返回非0值。若不是小写,则返回0。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int ret1 = islower('a');//判断字符'a'是否小写
	int ret2 = islower('A');//判断字符'A'是否小写
	printf("islower('a')=%d \nislower('A')=%d\n", ret1, ret2);
	return 0;
}

2. 字符转换函数

C语言提供了两个字符转换函数:

1.int toupper(int c);//将小写字符c转换成大写

2.int tolower(int c);//将大写字符c转换成小写

使用案例:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char str1[] = "i am a student";
	char* s1 = str1;
	char str2[] = "I AM A STUDENT";
	char* s2 = str2;
	//将小写字符串str1转换成大写
	while (*s1)
	{
		if (islower(*s1))
			*s1=toupper(*s1);
		putchar(*s1);
		s1++;
	}
	printf("\n");
	//将大写字符串str2转换成小写
	while (*s2)
	{
		if(isupper(*s2))
			*s2=tolower(*s2);
		putchar(*s2);
		s2++;
	}
	printf("\n");
	return 0;
}

3.strlen的使⽤和模拟实现

size_t strlen ( const char* str );

功能:返回字符串的长度

注意:

①strlen函数使用之前要包含头文件<string.h>

②strlen函数返回的是字符串'\0'之前的字符的个数(不包含'\0')

③传入的字符串必须含有'\0'

④函数的返回值类型为size_t(易错!)

使用案例:

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[] = "ABCDEFG";
	char str2[] = "ABCD\0EFG";
	size_t ret1 = strlen(str1);
	size_t ret2 = strlen(str2);
	printf("strlen(str1):%zd\nstrlen(str2):%zd\n", ret1, ret2);
	return 0;
}

模拟实现:

strlen函数可以三种不同方式来模拟实现,分别是:1、计数器 2、递归 3、指针 - 指针


//方式一:计数器
#include<stdio.h>
size_t my_strlen(const char* str)
{
	size_t count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}


//方式二:递归
#include<stdio.h>
size_t my_strlen(const char* str)
{
	if (*str == '\0') return 0;

	return my_strlen(str+1) + 1;
}


//方式三:指针 - 指针
#include<stdio.h>
size_t my_strlen(const char* str)
{
	char* left = str;//定义指针指向字符串首地址
	while (*str)
		str++;
	char* right = str;//定义指针指向字符串尾地址
	size_t ret = right-left;//指针-指针的值为两个指针之间元素的个数
	return ret;
}

4.strcpy的使⽤和模拟实现

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

功能:strcpy函数能将源字符串(右参数)的内容拷贝到目标空间(左参数)中。

注意:

①需要包含头文件<string.h>

②源字符串必须以‘\0’结尾

③目标空间必须足够大,以确保能够放入源字符串

④目标空间必须可修改

⑤源字符串的‘\0’也要拷贝到目标空间(注意!)

使用案例:


#include<stdio.h>
#include<string.h>
int main()
{
	char Destination[20] = "xxxxxxxx";//目标空间
	char Source[] = "ABCDEFG";//源字符串
	printf("%s\n", Destination);
	strcpy(Destination, Source);
	printf("%s\n", Destination);
	return 0;
}

模拟实现:


#include<stdio.h>
#include<string.h>
#include<assert.h>

char* my_strcpy(char* dest, const char* src)
{
	assert(dest);
	assert(src);
	char* ret = dest;
	while (*dest++ = *src++)
	{

	}
	return ret;
}

5.strcat的使⽤和模拟实现

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

功能:把源字符串拼接在目标空间后面。

注意:

①需要包含头文件<string.h>

②源字符串必须以‘\0’结尾

③目标空间也要有‘\0’,否则不知道往哪追加

④目标空间必须足够大,以确保能够容纳源字符串

⑤目标空间必须可修改

使用案例:

#include<stdio.h>
#include<string.h>
int main()
{
	char Destination[20] = "xxxxxxxx";
	char Source[] = "ABCDEFG";
	printf("%s\n", Destination);
	strcat(Destination, Source);
	printf("%s\n", Destination);
	return 0;
}

 

模拟实现:

#include<assert.h>
#include<stdio.h>
#include<string.h>
char* my_strcat(char* dest, const char* src)
{
	assert(dest);
	assert(src);
	char* ret = dest;
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *src++)
	{

	}
	return ret;
}

6. strcmp的使⽤和模拟实现

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

功能:strcmp函数会将str1与str2从头到尾逐个字符进行字符大小(ASCII码)的比较,若两个字符相同则跳过,直到找到第一个不同的字符进行比较并返回值说明。

注意:如果两个字符串完全相同,则返回值为0。

标准规定:

①第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字

②第⼀个字符串等于第⼆个字符串,则返回0

③第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

使用案例:


#include<stdio.h>
#include<string.h>
int main()
{
	//相同字符串比较
	char str1[] = "ABCDEFG";
	char str2[] = "ABCDEFG";
	int ret1 = strcmp(str1,str2);
	printf("%d\n", ret1);
	//当字符串1小于字符串2
	char str3[] = "AAAAAAA";
	char str4[] = "ABCDEFG";
	int ret2 = strcmp(str3, str4);
	printf("%d\n", ret2);
	//当字符串1大于字符串2
	char str5[] = "ABCDEFG";
	char str6[] = "AAAAAAA";
	int ret3 = strcmp(str5, str6);
	printf("%d\n", ret3);
	return 0;
}

模拟实现:

#include<assert.h>
#include<stdio.h>
#include<string.h>
int my_strcmp(char* str1, const char* str2)
{
	assert(str1);
	assert(str2);

	while (*str1== *str2&&*str1&&*str2)
	{
		str1++;
		str2++;
	}
	if (*str1 > *str2)
		return 1;
	else if (*str1 < *str2)
		return -1;
	else return 0;
}

7. strncpy函数的使⽤

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

功能:将字符串source中前num个字符拷贝到字符串destination中。

注意:如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。

使用案例:

#include<stdio.h>
#include<string.h>

int main()
{
	char arr1[20] = "xxxxx";
	char arr2[] = "I am a student";
	strncpy(arr1, arr2, 10);
	printf("%s\n", arr1);
	return 0;
}

8. strncat函数的使⽤

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

功能:将字符串source的前num个字符拷贝到字符串destination后边再追加一个‘\0’字符。

注意:如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "xxxxx";
	char arr2[] = "I am a student";
	strncat(arr1, arr2, 10);
	printf("%s\n", arr1);
	return 0;
}

9. strncmp函数的使⽤

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

功能:⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。(返回值规则与strcmp一样)

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "ABCDE";
	char arr2[] = "ABCDEFG";
	int ret1 = strncmp(arr1, arr2,5);
	printf("%d\n", ret1);
	int ret2 = strncmp(arr1, arr2, 6);
	printf("%d\n", ret2);
	return 0;
}

10. strstr的使⽤和模拟实现

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

功能:在str1中查找str2,并返回第一次出现str2的位置。

注意:字符串的比较不包含‘\0’,以'\0'作为结束标志。

使用案例:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "xxxABCDxxxx";
	char arr2[] = "ABCD";
	char* ret = strstr(arr1, arr2);
	printf("%s\n", ret);
	return 0;
}

模拟实现:

要模拟实现strstr函数,得考虑三种情况:

①str1中直接含有str2,例如:str1:xxxABC  str2:ABC

②str1中含有str2,但是在查找到str2之前有干扰项,例如:str1:AAABC  str2:ABC

③str1中不含有str2,此时直接返回NULL

#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);
	char* cur = str1;
	while (*cur)
	{
        //重置指针s1与s2的位置
		char* s1 = cur;
		char* s2 = str2;
        //若找到str2第一个字符,则接着找,直到字符不同
		while (*s1 == *s2&&*s2&&*s1)
		{
			s1++;
			s2++;
		}
        //若*s2为0,则说明str1中包含str2,返回地址cur
		if (*s2 == '\0')
			return cur;
		cur++;
	}
    //退出循环,说明str1中不包含str2,返回空
	return NULL;
}

11. strtok函数的使⽤

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

功能:用标记分割字符串

例如:str为:"ABC@DEF#123456",sep为:@#

则函数可将其分割为ABC   DEF   123456

注意:

sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合

第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记。

strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向该段字符串的指针。 例如:str:[email protected]   sep:@.  调用一次函数str结果为:A\0B.C  调用两次:A\0B\0C (注:strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容并且可修改。)

若strtok第一个参数不为NULL,则函数将找到str的第一个标记(将它改为\0),并保存该标记的位置。

若strtok第一个参数为NULL时,函数将从上次保存的位置开始往后找下一个标记(将其改为\0),并保存该标记位置以确保下次从此开始。

⑥如果字符串中不存在更多标记,则返回NULL。

使用案例:

#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "[email protected]";
	char sep[] = "@.";
	char* ret = strtok(str, sep);
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	//当后面没有标记时
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	return 0;
}

12. strerror函数的使⽤

char * strerror ( int errnum );

功能:返回错误信息的地址。 当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应的错误码,存放在errno中。 而在 strerror传入错误码,它就会返回这个错误码对应的错误信息。 例如:
​
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
	for (int i = 0; i <= 10; i++)
		printf("%s\n", strerror(i));
	return 0;
}

​

使用案例:
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
	FILE* pFile;
	pFile = fopen("hehe.txt", "r");
	if (pFile == NULL)
		printf("Error opening file hehe.txt: %s\n", strerror(errno));
	return 0;
}

END

标签:字符,函数,int,str2,str1,char,字符串,include
From: https://blog.csdn.net/NoobNo2/article/details/136816929

相关文章

  • 函数的详解
    目录1.函数的概念2.库函数2.1库函数的概念2.2 标准库和头文件2.3库函数的使用方法2.4 头文件包含2.5 库函数文档的一般格式3.自定义函数3.1函数的与法形式3.2函数举例4.实参和形参4.1实参4.2形参5.return语句6.嵌套调用和链式访问6.1嵌套调用......
  • C++ 指针,指针引用,二级指针作为实参传入函数体,形参改变指向的问题
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、形参指向变化,实参指向不变二、指针引用传递改变实参指向三、二级指针**传递改变实参指向一、形参指向变化,实参指向不变前提了解:无论是值传递,指针传递,引用传递,形参和实参都是完全不同的......
  • [C++提高编程](一):模板----函数模板
    目录函数模板作用函数模板的语法注意事项普通函数与函数模板的区别普通函数与函数模板的调用规则模板的局限性案例--通用数组选择排序从大到小模板是C++中泛型编程的基础,一个模板就是一个创建类或函数的蓝图或者公式。函数模板作用建立一个通用函数,其函数返回值类型......
  • 吴恩达2022机器学习专项课程(一) 3.5 可视化成本函数
    问题预览为什么要可视化成本函数?可视化之后的成本函数是什么样子?如何在三维空间里通过w和b找到一个成本函数的值?如何在三维空间里找到成本函数的最小值?解读可视化成本函数:为了更加方便的看到不同的w和b,是如何影响成本函数的。上节课只看到了w如何影响成本函数,这节课回归......
  • Vue 的父组件和子组件生命周期钩子函数执行顺序?
    Vue的父组件和子组件生命周期钩子函数执行顺序可以归类为以下4部分:加载渲染过程父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted子组件更新过程父beforeUpdate->子beforeUpdat......
  • 开窗函数进阶last_value特别地方
    有了开窗函数,让我们做统计方便很多。row_number(),sum,等常规用法,便不在这里讲。我们从一个问题开始withabcas(select1asidunionallselect2unionallselect3unionallselect4)selectid,FIRST_VALUE(id)over(orderbyid)asfirstid,LAST_VALUE(id)o......
  • 获取字符串长度LEN
    selectLEN('asd')--结果:{3}去除空格LTRIM、RTRIM、TRIMselectLTRIM('  444 5 ')--去除字符串左边的空格,结果:{444 5}selectRTRIM('  444 5 ')--去除字符串右边的空格,结果:{  444 5}selectTRIM('  444 5 ')--去除字符串两边的空格,结果:{444 5}......
  • java:欧拉公式e^ix==cosx+i*sinx 用Math类中的方法输出90°以内的欧拉函数数值,保留四位
    publicclassMain{//本题的要求:e^ix==cosx+i*sinxdoubleb,c;chari;publicstaticvoidmain(String[]args){for(doublej=0;j<90;j++){//用循环依次整出0-90度doublesum=0;//temp是e^ix;doublea=j;a=Math.toRadi......
  • STM32 AD单通道函数设计
    单片机学习!目录文章目录前言一、ADC配置步骤二、详细步骤2.1开启RCC时钟2.2配置GPIO2.3 配置多路开关2.4 配置ADC转换器2.5 开启ADC电源2.6 ADC进行校准        2.6.1复位校准        2.6.2等待复位校准完成    2.6.3开始......
  • 系统内置位运算函数总结
     __builtin_ctz()/__buitlin_ctzll()用法:返回括号内数的二进制表示数末尾0的个数__buitlin_clz()/__buitlin_clzll()用法:返回括号内数的二进制表示数前导0的个数__builtin_popcount()用法:返回括号内数的二进制表示数1的个数__builtin_parity()判断括号中数......