字符函数和字符串函数

终于把指针搞完了下面就是字符函数和字符串函数的讲解了,准备好。

1.字符分类函数

这是在鹏哥课件上拷贝过来的函数,这种函数是专门做字符分类的。也就是一个字符是属于什么类型的字符的.

这些函数的使用都需要包含一个头文件ctype.th

举个例子

int islower ( int c );

islower是能够判断参数部分的c是否是小写字母的。

通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,这则返回0

写一个代码,将字符串中的小写字母大写,其他字符不变

#include <stdio.h>
#include <ctype.h>
int main ()
{
     int i = 0;
     char str[] = "Test String.\n";
     char c;
     while (str[i])
     {
       c = str[i];
       if (islower(c)) 
         c -= 32;
     putchar(c);
     i++;
     }
 return 0;
}

  2.字符转换函数

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

在上面那串代码中我们是用islower函数来进行判断的大小写的,然后在用-32来转换大小写,但是我们现在有转换函数   tolowertoupper了直接使用就可以了。

这就是例子:

#include <stdio.h>
#include <ctype.h>
int main ()
{
 int i = 0;
 char str[] = "Test String.\n";
 char c;
 while (str[i])
 {
 c = str[i];
 if (islower(c)) 
 c = toupper(c);
 putchar(c);
 i++;
 }
 return 0;
}
 3.strlen的使用和模拟实现

strlen函数求的是字符串的长度,统计是字符串中'\0'之前的字符个数。(不包含’\0‘)

size_t strlen ( const char * str );

注意:

1.参数指向的字符串必须要以‘\0’结束。

2.注意函数的返回值为size_t,是无符号的(易错)

3.strlen使用时的头文件时<string.h>

关于strlen函数的模拟实现有三种:

1.计数器方法

2.指针-指针

3.递归的方式

下面一一举例:

计数器方法:

 如果不能创建临时变量怎么办?乂,对啦!就是递归。不懂递归的结合下面给的定义和代码看一看.

递归函数通常包含两部分:
 
基准情况(Base case):这是递归停止的条件,防止函数无休止地调用自己。如果没有基准情况,递归调用将无限进行下去,最终导致栈溢出。
递归情况(Recursive case):这是函数调用自身并逐渐逼近基准情况的部分。每次递归调用都应朝着能够到达基准情况的方向前进。

说白了递归就是函数不断的调用函数自己。

4. strcpy的使用和模拟实现

首先说明strcpy是干什么的。

首先strcpy是c语言中的一个标准库函数,定义在<string.h>头文件中,用于将一个字符串复制到另一个字符串中。它的原型如下:

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

   dest  :目标字符串,用于存放复制后的字符串。
  src  :源字符串,即要复制到   dest   的字符串。

另外这里有几个函数的注意事项

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

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

3.目标空间必须可以修改

下面进行strcpy函数的模拟实现:

但是这串代码还可以更精进一些

因为while循环是先执行在跳出,所以呢当*src'\0'复制给了*dest才会跳出循环。而上面的那串代码当*src等于\0之后就跳出来了  ,不会在进行括号里面的循环了,所以把\0进行复制是在循环外面。

 5.strcat的使用和模拟实现

还是老规矩先介绍这个函数是干什么的:

  strcat   是 C 语言标准库中的一个字符串操作函数,它用于将一个字符串拼接到另一个字符串的末尾。在标准库的实现中, strcat   会在目标字符串的末尾检查一个空字符    (\0)  (null terminator)来确定目标字符串的结束位置。它的原型是:

char *strcat(char *dest, const char *src);

 关于dest和src代表的意思就是和上面函数中参数代表的意思一样。

这个函数也是有注意事项的:

 模拟实现strcat函数:

​​char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	
		assert(dest != NULL);
	assert(src != NULL);
	while (*dest)//这个循环是先找到*dest的\0然后在在下面的循环中进行填补。
	{
		dest++;
	}
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[] = "hello ";
	char arr2[20] = "world";
	char *ret = my_strcat(arr1,arr2);
	printf("%s\n", arr1);
	return 0;
}

 那我们再进行一个问题的思考:字符串能否给自己追加?答案是不可以的,下面给解释一下:

重点 !!

字符串不能使用   strcat   函数对自己进行追加。因为   strcat   函数需要两个不同的内存区域一个是要追加到的目标区域(  dest  ),另一个是提供要追加的字符串源(  src  )。只有   dest   区域可以被写入,而   src   区域必须是可读的。
 
如果你尝试使用   strcat   作用于自身(即   src   和   dest   指向同一地址),这将导致未定义行为,因为函数会在   dest   末尾的空字符处开始写入   src   的内容,而这个位置正是   src   的开始位置,从而覆盖了它自己的数据。

OK了各位这就是今天所学,明天继续努力。

  • 54
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值