🌟菜鸟主页:@晨非辰的主页
👀学习专栏:《C语言学习》
💪学习阶段:C语言方向初学者
⏳名言欣赏:"编程的本质是理解问题,然后把它分解成可执行的步骤。"
目录
1. 字符分类函数
2. 字符转换函数
3. strlen函数
3.1 strlen函数使用示范
3.2 strlen的返回值
3.3 模拟实现strlen函数
4. strcpy函数(格式符隐式解引用)
4.1 strcpy函数使用示范
4.2 模拟实现strcpy函数
5. strcat函数
5.1 strcat函数使用示范
5.2 模拟实现strcat函数
1. 字符分类函数
--在C语言中有一系列函数专门做字符分类,判断一个字符属于什么类型的字符。
--以下函数都需要包含头文件:<ctype.h>
--这些函数的使用方式十分相似,下面就将一个函数为例解释: islower 函数
int lower(int a);
--函数判断字母是否为小写字母,是-返回非0整数,不是-返回0;
--练习:通过代码将字符串中的小写字母转换为大写字母:
#include <stdio.h>
#include <ctype.h>
int main()
{char arr[] = "Im a Chinese!";int i = 0;;while (arr[i]){if (islower(arr[i])){arr[i] -= 32;//大写字母Ascll码值与小写字母差32}printf("%c", arr[i]);i++;}return 0;
}
2. 字符转换函数
--除了上述的字符分类函数,还有这实现字符之间转换的字符转化函数;
--使用时包含头文件:<ctype.h>
int tolower(int c); 将传进去的大写字母转换为小写字母;
int toupper(int c); 将传进去的小写字母转换为大写字母;
--有了这两个函数就可以直接实现大小写转换,不用在+-32进行。
--练习:通过代码利用上述两个函数实现将字符串中的小写字符转换为大写:
int main()
{char arr[] = "Im a Chinese!";int i = 0;while (arr[i]){if (islower(arr[i])){arr[i] = toupper(arr[i]);}printf("%c", arr[i]);i++;}return 0;
}
3. strlen函数
size_t strlen (const char* str);
--介绍:
参数: str —— 指向 '\0' 结尾的字符串的指针;
返回值: size_t 类型的无符号整数,表示字符串的长度(不含 '\0' );
核心功能:计算字符串长度从起始地址开始遍历,直到遇到 '\0' 结束。
3.1 strlen函数使用示范
--使用须知:
- 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' );
- 参数指向的字符串必须要以 '\0' 结束;
- 注意函数的返回值为 size_t,是无符号的( 易错 );
- strlen的使用需要包含头文件<string.h>;
#include <string.h>
int main()
{const char* str = "abcdef";printf("%zd\n", strlen(str));return 0;
}
3.2 strlen的返回值
--为什么说返回值 size_t类型易错?请看下面代码:
#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if (strlen(str2) - strlen(str1) > 0)//一般认为输出<=,但实际不是{printf(">\n")else{printf("<=\n");}return 0;
}
--一般认为上面 3-6 输出 <=,但实际不是 ,输出 > :因为函数返回类型为无符号整型,所以运算结果也为无符号整型(>=0);想让它符合我们的认知,可以将类型强转为 int :
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if ((int)strlen(str2) - (int)strlen(str1) > 0){printf(">\n");}else{printf("<=\n");}return 0;
}
3.3 模拟实现strlen函数
--下面将呈现三种方法·,其中两种方式在前面已经见过:
--方式1:计算器
#include <assert.h>
size_t strlen(char* str)
{int count = 0;int i = 0;assert(str != NULL);while (*str){count++;str++;}return count;
}int main()
{char arr[] = "abcdef";size_t re = strlen(arr);printf("%d\n", re);return 0;
}
--方式2:指针-指针(参考:4.2部分--#C语言——学习攻略:深挖指针路线(一))
size_t my_strlen(char* str)
{assert(str != NULL);char* p = str;while (*str){str++;}return str - p;
}
int main()
{char arr[] = "abcdef";size_t ret = my_strlen(arr);printf("%zd\n", ret);return 0;
}
--方式3:函数递归
size_t my_strlen(const char* str)
{assert(str != NULL);if (*str == '\0'){return 0;}else{return 1 + my_strlen(str + 1);}}
int main()
{char arr[] = "abcdef";size_t ret = my_strlen(arr);printf("%d", ret);return 0;
}
4. strcpy函数(格式符隐式解引用)
char* strcpy(char* destination, cjar* source);
--介绍:
功能:字符串拷贝,将源头(src)的字符串拷贝到目标(dest )空间中,拷贝到源头字符串中的 '\0' 为止;
返回值:strcpy函数返回的目标空间的起始地址;
参数: destination指针,指向目的地空间;source指针,指向源头数据。
4.1 strcpy函数使用示范
使用须知——
- 源字符串必须以 '\0' 结束;
- 会将源字符串中的 '\0' 拷贝到目标空间;
- 目标空间必须足够大,以确保能存放源字符串,[ ]里不能为空;
- 目标空间必须可修改(字符串数组),比如常量字符串无法修改;
- 使用需要包含头文件<string.h>;
int main()
{char arr1[] = "hello";char arr2[20] = { 0 };char* ret = strcpy(arr2, arr1);printf("%s\n", ret); 无需解引用,%s 自动处理return 0;
}
隐式解引用:
--对于为什么输出 ret 不使用 %p :当要输出指针指向的内容时 %s 格式符本质上会隐式解引用指针,
4.2 模拟实现strcpy函数
void my_strcpy(char* dest, char* src)
{while (*dest++ = *src++){;}}
int main()
{char arr1[] = "hello world!";char arr2[] = "*************";my_strcpy(arr2, arr1);printf("%s\n", arr2);return 0;
}
5. strcat函数
char* strcat(char* destination, const char* source);
--介绍:
- 功能:字符串追加,把source指针的源字符串中的所有字符都追加到destination指向的空间中;
- 参数:destination指针,指向目的地空间;source指针,指向源头数据;
- 返回值:strcat函数返回的目标空间的起始地址;
5.1 strcat函数使用示范
使用须知——
- 源字符串必须以 '\0' 结束;
- 目标字符串中也得有 \0 ,否则无法知道追加从哪开始;
- 目标空间必须有足够的大,能容纳下源字符串的内容,[ ]里不能为空;
- 目标空间必须可修改;
- 使用需要包含头文件<string.h>;
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello";char arr2[] = "world";char* p = strcat(arr1, arr2);printf("%s\n", p);printf("%s\n", arr1);return 0;
}
5.2 模拟实现strcat函数
char* mystrcat(char* dest, const char* src)
{assert(dest && src);char* p = dest;while (*dest){dest++;}//找到目标字符串中的\0,明确从那里开始追加。while ((*dest++ = *src++)){;}return p;
}
int main()
{char arr1[20] = "hello";char arr2[] = "world";char* ret = mystrcat(arr1, arr2);printf("%s", ret);return 0;
}
结语:本篇文章到此结束,下一篇将会为大家呈现字符函数和字符串函数的剩余内容,如果这篇文章对你的学习有帮助的话,欢迎一起讨论学习,你这么帅、这么美给个三连吧~~~