字符与字符串函数
- 字符函数
-
- 字符小写判断
-
- 字符大写判断
- 判断是否数字字符
- 字符串函数
-
- strlen
-
- 1.补充一种模拟方法
- 2.注意返回值
- strcpy
-
- 代码演示
- 模拟实现
- strcat
-
- 代码演示
- 模拟实现
- strcmp
-
- 代码演示
- strncpy
-
- 代码演示
- 模拟实现
- strncat
-
- 代码演示
- 模拟实现
- strncmp
-
- 代码演示
- 模拟实现
- strstr
-
- 代码演示
- 模拟实现
- strtok
-
- 代码演示
- 在这里插入图片描述 这种有个问题就是,我们是知道分割有多少的部分,那如果在不知道具体分割多少部分,该怎么打印?
-
- strerror
-
- 代码演示
字符函数
这里说明常见的字符函数,这些知道了,剩下的都是一个套路; 包含头文件==#include<ctype.h>==
字符小写判断
islower 格式:
int islower(int c);
返回值为布尔类型:非零为true,零为false; 字符判断,就是看ASCLL码值
//字符判断大小写
#include<stdio.h>
#include<ctype.h>
int main()
{
char a = 'a';
int res = islower(a);
if (res) {
printf("小写字符\\n");
}
else
{
printf("大写字符\\n");
}
return 0;
}
题目:将小写字符转化为大写字符
//题目:将小写字符转化为大写字符
#include<stdio.h>
#include<ctype.h>
int main()
{
char arr[] = "HeLLo,World";
size_t len = strlen(arr);
for (int i = 0; i < len; i++) {
if (islower(arr[i])) {
arr[i] = arr[i] – 32;
}
}
printf("%s", arr);
return 0;
}
题目:将大写字符转化为小写字符
#include<stdio.h>
#include<ctype.h>
int main()
{
char arr[] = "HeLLo,World";
size_t len = strlen(arr);
for (int i = 0; i < len; i++) {
if (isupper(arr[i])) {
arr[i] = arr[i] + 32;
}
}
printf("%s", arr);
return 0;
}

字符大写判断
isupper 格式:
int isupper(int c);
//字符大写判断
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch = "A";
int res = isupper(ch);
if (res > 0) {
printf("大写字符");
}
else {
printf("小写字符");
}
return 0;
}

判断是否数字字符
#include<stdio.h>
#include<ctype.h>
int main()
{
char a = 'c';
int res = isdigit(a);
if (res > 0) {
printf("数字字符");
}
else {
printf("不是数字字符");
}
return 0;
}
其余字符函数都是差不多的,可以类比自己使用;
字符串函数
头文件:#include<stdio.h>
strlen
这个不过多讲,说两点:
1.补充一种模拟方法
//递归实现strlen的模拟
#include<stdio.h>
#include<string.h>
size_t My_strlen(const char* arr) {
if (*arr == '\\0') {
return 0;
}
return My_strlen(arr+1) + 1;
}
int main()
{
char arr[] = "abcdef";
size_t res = My_strlen(arr);
printf("长度:%d", res);
return 0;
}

2.注意返回值
strlen格式:
size_t strlen(const char *str)
strlen的返回值为size_t,无符号整型;
//看题比较大小
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abc";
char arr2[] = "abcdef";
if (strlen(arr1) – strlen(arr2) < 0) {
printf("<");
}
else
printf(">");
return 0;
}
注意在这题中打印出来的是大于号 strlen算出的是无符号类型size_t,相减是无符号的类型,得出的转化为补码 是一个非常大的正数 
strcpy
strcpy的作用是==string copy ==:字符串的拷贝 格式:
char *strcpy(char *dest, const char *src)
返回值为目标空间的起始地址,参数为两个字符指针,目标空间dest,源空间src
代码演示
//strcpy
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[100] = "hello";
char arr2[] = "world";
strcpy(arr1, arr2);
printf("arr1:%s\\n", arr1);
return 0;
}

这里的目标字字符串空间一定要够大 
模拟实现
#include<stdio.h>
#include<string.h>
char* My_strcpy(char* dest,char*sor) {
char* fla = dest;
while (*dest++ = *sor++) {
;
}
return dest;
}
int main()
{
char arr1[100] = {0};
char arr2[] = "hello world";
My_strcpy(arr1, arr2);
printf("arr1:%s\\n", arr1);
return 0;
}

strcat
字符串拼接:strcat 格式: char *strcat(char *dest, const char *src) 返回值为目标空间的起始地址,,参数为两个字符指针,目标空间dest,源空间src 这里的拼接必须是从目标字符串的==\\0==开始追加
代码演示
//strcat字符串的拼接
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[100] = "hello";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}

模拟实现
#include<stdio.h>
#include<string.h>
char* My_strcat(char* dest, char* src) {
//找到目标字符的‘\\0’
char* fla = dest;//标记起始地址
while (*dest!='\\0') {
dest++;
}
while (*dest++=*src++) {
;
}
return fla;
}
int main()
{
char arr1[100] = "hello";
char arr2[] = "world";
My_strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}

strcmp
strcmp字符串比较大小 格式:
int strcmp(const char *str1, const char *str2)
代码演示
#include<stdio.h>
int main()
{
char arr1[] = "abd";
char arr2[] = "abcdef";
int res = strcmp(arr1,arr2);
if (res > 0) {
printf("arr1>arr2");
}
else if (res < 0) {
printf("arr1<arr2");
}
else
printf("arr1==arr2");
return 0;
}
模拟实现:
#include<stdio.h>
int My_strcmp(const char* str1, const char* str2) {
while (*str1 == *str2) {
str1++;
str2++;
}
return *str1 – *str2;
}
int main()
{
char arr1[] = "abd";
char arr2[] = "abcdef";
int res = My_strcmp(arr1, arr2);
if (res > 0) {
printf("arr1>arr2");
}
else if (res < 0) {
printf("arr1<arr2");
}
else
printf("arr1==arr2");
return 0;
}
strncpy
strncpy:字符串的拷贝 格式:
char *strncpy(char *dest, const char *src, size_t n)
dest – 指向用于存储复制内容的目标数组。 src – 要复制的字符串。 n – 要从源中复制的字符数。
代码演示
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "hello word";
char arr2[100] = { 0 };
strncpy(arr2, arr1,5);
printf("%s", arr2);
return 0;
}

模拟实现
#include<stdio.h>
#include<string.h>
char* My_strncpy(char* dest, const char* src, size_t n) {
char* fla = dest;
while (n) {
*dest++ = *src++;
n—;
}
return fla;
}
int main()
{
char arr1[] = "hello word";
char arr2[100] = { 0 };
My_strncpy(arr2, arr1,5);
printf("%s", arr2);
return 0;
}

strncat
strncat的使用 格式:
char *strncat(char *dest, const char *src, size_t n)
参数 dest – 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。 src – 要追加的字符串。 n – 要追加的最大字符数。
代码演示
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[100] = "hello";
char arr2[] = "world";
strncat(arr1, arr2, 3);
printf("%s", arr1);
return 0;
}
模拟实现
char* My_strncat(char* dest, const char* src, size_t n) {
char* fla = dest;
while (*dest != '\\0') {
dest++;
}
while (n) {
*dest++ = *src++;
n—;
}
return fla;
}
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[100] = "hello";
char arr2[] = "world";
My_strncat(arr1, arr2, 3);
printf("%s", arr1);
return 0;
}

strncmp
strncmp 格式:
int strncmp(const char *str1, const char *str2, size_t n)
str1 – 要进行比较的第一个字符串。 str2 – 要进行比较的第二个字符串。 n – 要比较的最大字符数。
代码演示
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcd";
char arr2[] = "abe";
int res = strncmp(arr1, arr2, 2);
if (res > 0) {
printf(">");
}
else if (res < 0) {
printf("<");
}
else printf("=");
return 0;
}
模拟实现
#include<stdio.h>
#include<string.h>
int My_strncmp(const char* str1, const char* str2, size_t n) {
if (n == 0) {
return 0;
}
while (n > 0) {
if (*str1 != *str2) {
return (*str1 – *str2);
}
if (*str1 == '\\0') {
return 0;
}
str1++;
str2++;
n—;
}
return 0;
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "abe";
int res = My_strncmp(arr1, arr2, 2);
if (res > 0) {
printf(">");
}
else if (res < 0) {
printf("<");
}
else printf("=");
return 0;
}

strstr
strstr字符串中寻找字符串 格式:
char *strstr(const char *haystack, const char *needle);
haystack – 要搜索的主字符串。 needle – 要查找的子字符串。
代码演示
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdefg";
char arr2[] = "def";
char* res = strstr(arr1, arr2);
printf("%s", res);
return 0;
}

模拟实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* My_strstr(const char* str1, const char* str2) {
assert(str1 && str2);
char* cp = str1;
char* sp = NULL;
while (*cp) {
cp = str1;
sp = str2;
while (*cp == *sp) {
cp++;
sp++;
}
if (*sp == '\\0') {
return str1;
}
str1++;
}
return NULL;
}
int main()
{
char arr1[] = "abcdefg";
char arr2[] = "def";
char* res = My_strstr(arr1, arr2);
printf("%s", res);
return 0;
}

strtok
strtok 分割字符串,比较特殊,注意关注; 格式:
char *strtok(char *str, const char *delim)
str: 要分割的字符串。在第一次调用时,传入要分割的字符串;后续调用时,传入 NULL,表示继续分割同一个字符串。 delim: 分隔符字符串。strtok() 会根据这个字符串中的任意一个字符来分割 str。
代码演示
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "lguotao@qq.com";
char* ch = "@.";
char* res = strtok(arr, ch);
printf("%s\\n", res);
res = strtok(NULL, ch);
printf("%s\\n", res);
res = strtok(NULL, ch);
printf("%s\\n", res);
return 0;
}
这种有个问题就是,我们是知道分割有多少的部分,那如果在不知道具体分割多少部分,该怎么打印?
要用到循环
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "lguotao@qq.com";
char* ch = "@.";
char* res;
for (res = strtok(arr, ch); res != NULL; res = strtok(NULL, ch)) {
printf("%s\\n", res);
}
return 0;
}

strerror
这个函数是用来找库函数错误出现的原因; 每一个错误都会有对应的错误码,0~9是对应错误的错误码
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
for (int i = 0; i < 10; i++) {
printf("%d:%s\\n", i, strerror(i));
}
return 0;
}

代码演示
打印出错误需要用到errno函数,对应头文件为==#include<errno.h>==
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
FILE* res = fopen("bit.txt", "r");//这是用于打开文件,了解一下;
//返回值为FILL*,如果打开没有或者失败,返回NULL
if (res == NULL) {
printf("错误的原因:%s",strerror(errno));
}
else
printf("成功");
return 0;
}
对于打印错误,C提供了一种函数叫perror,头文件为==#include<stdio.h>==
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
FILE* res = fopen("bit.txt", "r");//这是用于打开文件,了解一下;
//返回值为FILL*,如果打开没有或者失败,返回NULL
if (res == NULL) {
perror("错误的原因:");//直接用这个打印错误
}
else
printf("成功");
return 0;
}

根据需要,自己选择;
大家点点关注,🦀🦀 下期内存函数



