欢迎各位来指点我的博客哦!
主页:趋早–Step
专栏:C语言
gitte网站:https://gitee.com/good-thg
文章目录
一、字符分类函数
顾名思义,字符分类函数就是用来做字符分类的,就是能够让我们知道这是什么类型的函数,这些函数都需要一个头文件 ctype.h
接下来,就让我们来学习这些函数吧!
我们先来学些最基础的几个函数
islower ----------小写字符a~z
isupper----------大写字母A~Z
isalpha----------所有大小写字母
isdigit------------十进制数字0~9
例题一
这些函数就是用来做判断的,比如说:我现在要判断一个字母是不是小写字母。我该如何判断呢?
首先按照我们以前的方法来:
#include<stdio.h>
int main()
{
char ch = 0;
scanf("%c", &ch);
if (ch>='a' && ch <= 'z') // 判断输入是否是小写字母
{
printf("Yes\n"); // 是小写输出Yes
}
else
{
printf("No\n"); // 其他类型输出No
}
return 0;
}
就让我们运行代码来感受一下这个代码的功能吧!
很明显,上面的代码成功的执行了,但是我们能否使用其他方法来实现这个代码呢?是可以的,就是使用我们的字符分类函数,我们上面有说到判断小写字母的函数是islower,而且在使用这个函数时需要包含头文件ctype.h,代码如下:
#include<stdio.h>
#include<ctype.h> // 包含头文件
int main()
{
char ch = 0;
scanf("%c", &ch);
if (islower(ch)) // 判断
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
我们用同样的测试用例来测试这个代码:
测试结果如下:
我们可以看到这两个代码的运行结果都是一样的,但是我们也许会想,这两个代码量都差不多,其实是可以任意选一种的。事实也是如此,但是我们也知道,在有大量代码的时候,字符分类函数就有了很大的作用了,使用这个函数的作用不仅仅是能简化代码,还能避免出错。
我们用例题二来向大家展示:
例题二
从键盘输入一个字符,判断字符类型并且输出对应的提示信息:
输入格式: 输入一个字符
输出格式:
如果该字符是大写字母,输出upper;如果该字符是小写字母,输出lower;如果该字符是数字,输出digit,如果是其他字符,输出other。
代码如下:
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch;
scanf("%c", &ch);
if (isupper(ch))
printf("upper\n");
else if (islower(ch))
printf("lower\n");
else if (isdigit(ch))
printf("digit\n");
else
printf("other\n");
return 0;
}
我们来测试一下:
通过以上用例我们就学会了字符分类函数的使用了,然而我们的字符分类函数还不止这四个,还有以下几个:
iscntrl------------任何控制字符
isspace---------空白字符(空格,换行符等)
isxdigit----------十六进制数字,包括所有十进制数字与所有字母
isalnum---------字母或者数字
ispunct----------标点符号,任何不属于数字或者字母的符号
isgraph----------任何图形字符
isprint------------任何可打印字符
但是这里就不会仔细讲解了,因为这些函数的使用方法都是一样的,只要掌握了其中一个函数的使用方法,剩下的就可以举一反三了。
我们要是还想自学的话,可以从下面网站中学习:
二、字符转换函数
在C语言中,有两个字符转换函数,分别是:
toupper---------小写字符转大写
tolower---------大写字母转小写
我们还是使用代码来演示这两个函数的功能:
我们现在要输入一个字母,并且把大写字母转换为小写,小写字母转换为大写。
代码如下:
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch = 0;
while (scanf("%c", &ch) != EOF)
{
if (islower(ch))
{
printf("%c\n", toupper(ch));
}
if (isupper(ch))
{
printf("%c\n", tolower(ch));
}
}
return 0;
}
运行结果如下:
三、字符串函数
1.strlen
(1)strlen函数的使用
strlen函数的作用是计算字符串的长度,统计字符串中’\0’之前出现的字符个数,我们要注意的是:
1、参数指向的字符串要以’\0’结尾;
2、函数的返回值为size_t;
3、strlen函数的使用需要包含头文件string.h
我们使用代码来演示strlen的使用:
#include<stdio.h>
#include<string.h> // 头文件
int main()
{
char arr[] = "abcdef"; // 字符串
size_t len = strlen(arr); // 求字符串长度,返回值是size_t
printf("%zd", len); // 使用%zd打印
return 0;
}
运行结果如下:
(2)strlen函数的模拟实现
计数器方式实现
#include<stdio.h>
#include<assert.h>
int my_strlen(const char * str)
{
int count = 0;
assert(str);
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
size_t len = my_strlen(arr);
printf("len = %zd\n", len);
return 0;
}
代码运行结果如下:
递归方式(不创建临时变量)
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{
assert(str);
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str + 1);
}
int main()
{
char arr[] = "abcdef";
size_t len = my_strlen(arr);
printf("len = %zd\n", len);
return 0;
}
代码运行如下:
指针 - 指针方式
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{
assert(str);
char* tmp = str;
while (*tmp != '\0')
{
tmp++;
}
return tmp - str;
}
int main()
{
char arr[] = "abcdef";
size_t len = my_strlen(arr);
printf("len = %zd\n", len);
return 0;
}
代码运行如下:
好的,以上就是strlen函数的使用和模拟实现,我们要一直记得strlen函数使用方法条件。
2、strcpy
(1)strcpy函数的使用
strcpy函数是用来字符串拷贝的
1、源字符串必须以’\0’结尾;
2、会将源字符串中的’\0’拷贝到目标空间;
3、目标空间必须足够大,确保能存放源字符串;
4、目标空间必须课修改。
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "hello world";
char arr2[20] = { 0 };
strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
运行结果如下:
(2)strcpy函数的模拟实现
代码如下:
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, char* src)
{
char* ret = dest;
assert(dest && src);
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "hello world";
char arr2[20] = { 0 };
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
代码运行如下:
3、strcat
(1)strcat的使用
strcat函数是用来连接字符串的
1、源字符串必须以’\0’结束;
2、目标字符串中也有’\0’;
3、目标空间必须足够大,能够源字符串的内容;
4、目标空间可修改。
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
代码运行如下:
(2)strcat的模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
运行结果如下:
4、strcmp
(1)strcmp的使用
strcmp是用来比较两个字符串的
1、当第一个字符串大于第二个字符串时,返回大于0的数字;
2、当第一个字符串等于第二个字符串时,返回0;
3、当第一个字符串小于第二个字符串时,返回小于0的数字。
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdef";
int ret = strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
运行结果如下:
(2)strcmp的模拟实现
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return str1 - str2;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdef";
int ret = my_strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
运行结果如下:
5、strncpy函数的使用
strncpy是拷贝num个字符从源字符串到目标空间,如果源字符串的长度小于num,则拷贝完字符串后,在目标的后边追加0,直到num个。
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[20] = {0};
strncpy(arr2, arr1,4);
printf("%s\n", arr2);
return 0;
}
运行结果如下:
#include<stdio.h>
char* my_strncpy(char* dest, const char* src, int n)
{
int i = 0;
for (i = 0; src[i] != '\0' && i < n; i++)
{
dest[i] = src[i];
}
dest[i] = '\0';
return dest;
}
int main()
{
char arr1[] = "abcdef";
char arr2[20] = {0};
my_strncpy(arr2, arr1, 4);
printf("%s\n", arr2);
return 0;
}
运行结果如下:
6、strncat函数的使用
strncat能够把num个字符追加到另一个字符串后边并且追加一个’\0’
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
strncat(arr1, arr2, 5);
printf("%s\n", arr1);
return 0;
}
运行结果如下:
7、strncmp函数的使用
strncmp是比较两个字符串前num个字符的大小
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "abcde";
char arr2[] = "abdef";
int ret = strncmp(arr1, arr2, 4);
printf("%d\n", ret);
return 0;
}
运行结果如下:
8、strstr
(1)strstr的使用
strstr是用来在一个字符串中查找另一个字符串的,返回的是这个字符串在另一个字符串中第一次出现的位置;如果找不到,则返回空指针。
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "hello world";
const char* p = "or";
char* ret = strstr(arr1, p);
printf("%s\n", ret);
return 0;
}
运行结果如下:
(2)strstr的模拟实现
#include<stdio.h>
char* my_strstr(const char* str1, const char* str2)
{
const char* s1 = str1;
const char* s2 = str2;
const char* cur = str1;
if (*str2 == '\0')
{
return (char*)str1;
}
while (*cur)
{
s1 = cur;
s2 = str2;
while (*s1!='\0'&&*s2!='\0'&& * s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cur;
}
cur++;
}
return NULL;
}
int main()
{
char arr1[] = "hello world";
char arr2[] = "or";
char* ret = my_strstr(arr1, arr2);
printf("%s\n", ret);
return 0;
}
运行结果如下:
9、strtok的使用
strtok可以把字符串中用分隔符隔开的串提取出来
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abc.defhij@kkk";
char arr2[30] = { 0 };
strcpy(arr2, arr1);
const char* sep = ".@";
char* ret = NULL;
for (ret = strtok(arr2, sep); ret != NULL; ret = strtok(NULL, sep))
{
printf("%s\n", ret);
}
return 0;
}
运行结果如下:
10、strerror的使用
strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
让我们来打印一下1–10的错误对应的信息
让我们来使用一下这个函数:
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE* pf = fopen("learn.txt", "r"); // 打开文件
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
fclose(pf); // 关闭文件
return 0;
}
运行结果如下:
11、perror
perror可以直接把错误信息打印出来
#include<stdio.h>
int main()
{
FILE* pf = fopen("learn.txt", "r");
if (pf == NULL)
{
perror("problem");
return 1;
}
fclose(pf);
return 0;
}
运行结果如下:
好了,到这里咱们《字符函数与字符串函数》部分就结束了,我们学习了很多函数的使用以及他们的模拟实现。我们在平时的练习中要多多使用来巩固它们!
标签:字符,return,函数,int,char,arr1,字符串,include From: https://blog.csdn.net/2301_82247031/article/details/137022532