终于把指针搞完了下面就是字符函数和字符串函数的讲解了,准备好。
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来转换大小写,但是我们现在有转换函数 tolower和toupper了直接使用就可以了。
这就是例子:
#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 的开始位置,从而覆盖了它自己的数据。