悲愤之作--字符函数和字符串函数

        刚刚老弟脑子一抽,去烫了个头,痛心疾首。又因无处发泄自己内心的悲愤,便化其为动力,写下了这篇关于《字符函数和字符串函数》的匠心之作。请看在小弟这悲惨的头发,给孩子点一键三连吧!

目录

1. 字符分类函数

2. 字符转换函数

3. strlen的使用和模拟实现

 4. strcpy 的使用和模拟实现

5. strcat 的使用和模拟实现

 6. strcmp 的使用和模拟实现

7. strncpy 函数的使用

8. strncat 函数的使用

 9. strncmp函数的使用

10. strstr 的使用和模拟实现

11. strtok 函数的使用

12. strerror 函数的使用


Let’s Start!Let’s Start!Let’s Start!Let’s Start!Let’s Start!Let’s Start!

1. 字符分类函数

        C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。这些函数的使用都需要包含一个头文件是ctype.h

        这些函数的使用方法非常类似,我们以islower函数为例:

int islower(int c);

        islower 是能够判断参数部分的c是否是小写字母的。通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回0。

练习:写一个代码,将字符串中的小写字母转大写,其他字符不变。

#include<stdio.h>
#include<ctype.h>
int main()
{
	int i = 0;
	char arr[] = "I Am A Student.\n";
	while (arr[i])
	{
		if (islower(arr[i]))
			arr[i]=arr[i]-32; 
		putchar(arr[i]);
		i++;
	}
	return 0;
}

2. 字符转换函数

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

int tolower(int c);//大写字母转小写
int toupper(int c);//小写字母转大写

         上面的代码,我们将小写转大写,是通过-32完成的,现在可以直接使用 tolower 函数。

int main()
{
	int i = 0;
	char arr[] = "I Am A Student.\n";
	while (arr[i])
	{
		if (islower(arr[i]))
			arr[i] = toupper(arr[i]);
		putchar(arr[i]);
		i++;
	}
	return 0;
}

3. strlen的使用和模拟实现

        strlen函数原型:

size_t strlen (const char * str );

• 字符串以\0作为结束标志,strlen函数返回的是在\0前面出现的字符个数

• 参数指向的字符串必须要以\0结束

• 注意函数的返回值为size_t,是无符号的

• strlen的使用需要包含头文件string.h

int main()
{
	//strlen返回无符号整形,两个无符号整形加减运算后结果仍为无符号整数
	if (strlen("abc") - strlen("abcdefg") > 0)
	//可能会认为3-6=-3,打印小于,但这是错误的
	{
		printf("大于\n");//打印大于
	}
	else
	{
		printf("小于等于\n");
	}
	return 0;
}

        strlen的模拟实现:

//方式1:计数器方式
size_t my_strlen1(const char* str)
{
	size_t count = 0;
	assert(str != NULL);//判断str不是空指针
	while (*str!='\0')
	{
		count++;
		str++;
	}
	return count;
}

//方式2:不能创建临时变量计数器
size_t my_strlen2(const char* str)
{
	assert(str);
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);//递归
}

//方式3:指针-指针的方式
size_t my_strlen3(char* str)
{
	assert(str);
	char* start = str;
	while (*start)
		start++;
	return start - str;
}

 4. strcpy 的使用和模拟实现

         strcpy函数原型:

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

• 将source指向的字符串复制到destination指向的数组中

• 源字符串必须以\0结束

• 会将源字符串中的\0拷贝到目标空间

• 目标空间必须足够大,以确保能存放源字符

• 目标空间必须可修改

int main()
{
	char* p = "abcdefg";//p是常量字符串,不能被修改
	char arr[20] = "hello world";
	strcpy(p, arr);//把arr复制到p里
	printf("%s\n", p);
}

        strcpy的模拟实现:

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

5. strcat 的使用和模拟实现

        strcat函数原型:

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

• 将source字符串的副本追加到destination字符串,destination的\0被source的首字符覆盖,两者串联形成新字符串

• 源字符串必须以\0结束

• 目标字符串中也得有\0

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

• 目标空间必须可修改

        strcat的模拟实现:

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	//1.找到目标空间的\0
	while (*dest)
	{
		dest++;
	}
	//2.把arr2的内容复制到arr1的\0位置
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

        易错:

int main()
{
	char arr1[20] = "hello";
	my_strcat(arr1, arr1);
	printf("%s\n", arr1);//程序崩溃
}

        将hello的副本追加到hello后面,hello的\0会被h覆盖,但是由于hello最后的\0被覆盖,因此hello的副本也不包含\0,因此复制完这个字符串没有\0作为结尾,就会死循环还会越界访问。

 6. strcmp 的使用和模拟实现

• 该函数是用来比较每个字符串的第一个字符

• 第一个字符串大于第二个字符串,则返回大于0的数字

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

• 第一个字符串小于第二个字符串,则返回小于0的数字

• 比较两个字符串中对应位置上字符ASCII码值的大小来判断字符串大小

注意:比较的不是字符串的长度。

        strcmp的模拟实现:

int my_strcmp (const char * str1, const char * str2)
{
	int ret = my_strcmp(str1, str2);
	assert(str1 != NULL);
	assert(str2 != NULL);
	while(*str1 == *str2)
	{
		if(*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1-*str2;
}

7. strncpy 函数的使用

        strncpy函数原型:

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

• 将source的前num个字符复制到destination,如果source的长度小于num,剩下的部分用0填充

• 拷贝num个字符从源字符串到目标空间

int main()
{
	char arr1[20] = "hello";
	char arr2[20] = "nice to meet you";
	strncpy(arr1, arr2, 4);
	printf("%s\n", arr1);//打印niceo
}

8. strncat 函数的使用

        strncat函数原型:

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

• 将source的前num个字符追加到destination的末尾,再追加一个\0

• 如果source的长度小于num,只会将字符串中到\0的内容追加到destination末尾

int main()
{
	char arr1[20] = "hello";
	char arr2[20] = "world";
	strncat(arr1, arr2, 3);
	printf("%s\n", arr1);//打印hellowor
}

 9. strncmp函数的使用

        strncmp函数原型:

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

        比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字母,如果提前发现不一样就提前结束,大的字符所在的字符串大于另一个。如果num个字符都相等,就返回0。

int main()
{
	char arr1[20] = "abcdefg";
	char arr2[20] = "abde";
	int ret = strncmp(arr1, arr2, 4);
	printf("%d\n", ret);//-1
}

10. strstr 的使用和模拟实现

        strstr函数原型:

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

• 函数返回字符串str2在字符串str1中第一次出现的位置然后往后打印

• 如果找不到就会返回空指针

• 字符串的比较不包含\0,以\0 作为结束标志

int main()
{
	char* str1 = "hello";
	char* str2 = "ll";
	char* ret = strstr(str1, str2);
	printf("%s\n", ret);//打印llo
}

         strstr的模拟实现:

char* my_strstr(const char* str1, const char* str2)
{
	const char* cur = (char*)str1;
	const char* s1 = NULL;
	const char* s2 = NULL;
	assert(str1 && str2);
	if (!*str2)
		return (char*)str1;
	while (*cur)
	{
		s1 = cur;
		s2 = str2;
		while (*s1 && *s2 && *s1 == *s2) 
		{
			s1++;
			s2++;
		}
		if (*s2=='\0')
			return (char*)cur;
		cur++; 
	}
	return(NULL);
}

11. strtok 函数的使用

        strtok函数原型:

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

• sep指向一个字符串,定义了用作分隔符的字符集合

• str指定一个字符串,它包含了0或多个由sep字符串中一个或者多个分隔符分割的标记。

• strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)

• strtok函数的第一个参数不为空,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

• strtok函数的第一个参数为空,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

• 如果字符串中不存在更多的标记,则返回空指针。

int main()
{
	char arr[] = "192.168.6.111";
	char* sep = ".";//以.作为分隔符
	char* str = NULL;
	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
	{
		printf("%s ", str);//打印192 168 6 111
	}
	return 0;
}

12. strerror 函数的使用

        sterror函数原型:

char * strerror ( int errnum );

•  strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

• 在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在errno.h 这个头文件中说明的,C语言程序启动的时候就会使用一个全面的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误。当我们使用标准库中的函数时发生了某种错误,就会把对应的错误码存放在errno中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

        也可以了解一下perror函数,perror函数相当于一次将上述代码中的printf一行完成了,直接将错误信息打印出来。perror函数打印完参数部分的字符串后,再打印一个冒号和一个空格,再打印错误信息。 

        以上就是本文的全部内容,博主现在要去镜子前重新搞一下自己的头发了。感谢各位的点赞关注,关注博主不迷路,博主带你上高速!!! 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值