初学c语言15(字符和字符串函数)
一.字符串分类函数
头文件:ctype.h
作用:判断是什么类型的字符
函数举例:
函数 | 符合条件就为真 |
islower | 判断是否为小写字符(a~z) |
isupper | 判断是否为大写字符(A~Z) |
isdigit | 十进制数字,(0~9)字符 |
isxdigit | 16进制数字,十进制数字字符,大写A~Z,小写a~z |
isspace | 空白字符(空白换行等) |
iscntrl | 任何控制字符 |
isalpha | 字母a~z,A~Z |
isalnum | 字母和数字 |
ispunct | 标点符号 |
isgrape | 任何图形字符 |
isprint | 任何可打印字符 |
应用举例:
代码1(islower):
#include <stdio.h> //将字符串中的小写转换为大写(普通)
#include <ctype.h>
int main()
{int i = 0;char arr[] = "I am from China";while (arr[i]){if (islower(arr[i]))arr[i] -= 32;printf("%c", arr[i]);i++;}return 0;
}
运行结果:
二.字符转化函数
1.tolower
将大写转化为小写
2.toupper
将小写转化为大写
应用:
代码:
#include <stdio.h>
#include <ctype.h>
int main()
{int i = 0;char arr[] = "I am from China";while (arr[i]){if (islower(arr[i]))arr[i] = toupper(arr[i]);printf("%c", arr[i]);i++;}return 0;
}
运行结果:
三.strlen的返回值
返回值为size_t类型的,为无符号类型(>=0)
举例:
#include <stdio.h>
#include <string.h>
int main()
{int arr[] = "hjf";int arr2[] = "hjfjdf";if ((strlen(arr) - strlen(arr2)) > 0)printff(">");elseprintff("<=");return 0;
}
结果和解释:
1.strlen的模拟和实现(递归)
代码:
#include <stdio.h>
size_t my_strlen(char* pa)
{if (*pa == 0)return 0;elsereturn 1 + my_strlen(pa + 1);
}
int main()
{char arr2[] = "hjfjdf";printf("%zu", my_strlen(arr2));return 0;
}
结果:
四.strcpy
作用:字符串拷贝,拷贝到源头的‘\0’为止
source:指针,指向源头数据
destination:指针,指向目的地空间,拷贝源头数据包括‘\0’
返回值:destination的首元素地址
头文件:string.h
注意:目的地空间必须足够大
举例:
代码:
#include <stdio.h>
#include <string.h>
int main()
{char arr2[] = "hello";char arr1[] = "world";printf("%s", strcpy(arr2, arr1));return 0;
}
结果:
模拟和实现:
代码:
#include <stdio.h>
char* my_strcpy(char* des, const char* sou)
{char* ret = des;while (*des++ = *sou++){;}return ret;
}
#include <string.h>
int main()
{char arr2[] = "hello";char arr1[] = "world";printf("%s", my_strcpy(arr2, arr1));return 0;
}
结果:
五.strcat
与strcat参数、返回值一样
作用:把source的字符串追加到destination后
举例:
代码:
#include <stdio.h>
#include <string.h>
int main()
{char arr2[20] = "hello";char arr1[] = "world";printf("%s", strcat(arr2, arr1));return 0;
}
结果:
模拟和实现:
代码:
#include <stdio.h>
char* my_strcat(char* des, const char* sou)
{char* re = des;while (*des){des++;}while (*des++ = *sou++){;}return re;
}
int main()
{char arr2[20] = "hello";char arr1[] = "world";printf("%s", my_strcat(arr2, arr1));return 0;
}
结果和解释:
六.strcmp(补充指针5)
模拟实现:
代码:
#include <stdio.h>
int my_strcmp(char* str1, char* str2)
{while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}return *str1 - *str2;
}
int main()
{char arr[] = "abcd";char arr1[] = "ab";int ret = my_strcmp(arr, arr1);printf("%d", ret);return 0;
}
结果:
七.strncpy
形式:
功能:字符串拷贝,与strcpy相比,可以控制拷贝字符串数量
应用:
八.strncat
形式:
功能:与strcat相比,可以控制追加字符数量
应用:
九.strncmp
功能:与strncmp相比,可以控制比较字符的数量
十.strstr
形式:
功能:查str2指向的字符串在str1指向的字符串中第一次出现的位置
返回值:
如果找到了,返回第一次出现位置的指针
没找到返回空指针
应用:
模拟实现:
代码:
#include <stdio.h>
const char* my_strstr(const char* str1, const char* str2)
{char* p = str1;while (*p){char* S1 =p;char* S2 = str2;while (*S1 && *S2 && *S1==*S2){S1++;S2++;}if (*S2 == '\0')return p;p++;}return NULL;
}
int main()
{char arr[] = "abcdefccdef";char arr1[20] ="def";printf("%s",my_strstr(arr,arr1));return 0;
}
结果:
十一.strtok
形式:
功能:
1.分割字符串,根据delimiters参数中的分隔符将字符串分成多个子字符串
2.根据delimiters参数中的分格符会插入’\0‘替换分隔符的位置
参数:
str: 首次传入带分割的字符串,后续传NULL,表示继续分割同一个字符串
delimiters:分隔符
返回值:
成功时返回当前指向的字符串
没有更多字符串时返回NULL
应用:
代码:
#include <stdio.h>
#include <string.h>
int main()
{char arr[] = "192.110...211.231";char arr1[20] =".";for (char* p = strtok(arr, arr1);p != NULL;p = strtok(NULL, arr1)){printf("%s\n", p);}return 0;
}
结果: