一、字符分类函数
字符分类函数是C语言中用于判断字符属于特定类型的一系列函数,这些函数主要包含在头文件
<ctype.h>
中,这些函数通过接受一个整型参数(字符的ACSII值),然后用返回整型值来表达真假。例如 int isupper(int c),如果参数c是大写字母,则返回一个非零整数,反之,则返回0。下列是一些常见的字符分类函数
函数 | 判断 |
iscntrl(int c) | 检查一个字符是否为控制字符 |
isspace(int c) | 检查一个字符是否为空白字符,包括空格‘ ’、制表符‘\t'、换页符'\f'、换行符'\n'、回车符'\r'和垂直制表符'\v' |
islower(int c) | 判断一个字符是否为小写字母,包括a~z |
isupper(int c) | 判断一个字符是否为大写字母,包括A~z |
isalpha(int c) | 判断一个字符是否为字母字符,包括a~z或A~Z |
isdigit(int c) | 判断一个字符是否为十进制数字,包括’0‘~’9‘ |
isprint(int c) | 判断一个字符是否为打印字符,包括图形字符和空白字符 |
ispunct(int c) | 判断一个字符是否为标点符号,包括任何不属于数字和字母的图形字符 |
isalnum(int c) | 判断字母或者数字,包括a~z,A~Z,0~9 |
isgraph | 任何图形字符 |
isxdigit | 16进制数字,包括所有十进制数字字符,小写字母a~f,大写字母A~F。 |
二、字符转换函数
我们主要学习的字符转换函数运用于字母之间大小写的转换,包括了int tolower(int c)和int toupper(int c),它们的头文件为<ctype.h>
#include<stdio.h>
#include<ctype.h>
int main()
{
char arr[] = "AAAbbb";
int i=0;
for(int i=0;arr[i]!='\0';i++)//保证循环到末尾时结束
{
printf("%c", toupper(arr[i]));//每次打印一字符
}
printf("\n");
for (int i = 0;arr[i] != '\0';i++)
{
printf("%c", tolower(arr[i]));
}
return 0;
}
完成以上代码,我们就可以得到以下结果
三、strcpy函数及strncpy函数
1.strcpy函数
strcpy
函数是C语言中用于字符串复制的标准库函数,其主要功能是将一个字符串完全复制到另一个字符串中。该函数的原型定义如下:
char*strcpy(char*dest,const char*src);
注意事项;
- 目标空间足够大:必须确保目标字符串数组有足够的空间来容纳源字符串的所有字符以及结束符'
\0'
。如果目标数组不够大而源字符串长度过长,可能会导致缓冲溢出(buffer overflow),从而引发安全问题。 - 源字符串必须以'
\0'
结尾:源字符串在复制之前必须包含一个'\00000000000000000000000000000000000000000000000000000000000000000'
终止符,否则可能造成数据丢失或错误。 - 目标空间可修改:目标空间必须是可以被修改的,不能是只读的内存区域
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char *dest, const char* str)
{
assert(dest != NULL && str != NULL);//保证二者的内容不为空
char* n = dest;//保存首地址
while (*dest++ == *str++)
{
;
}
return n; //返回得运行结果
}
int main()
{
char arr1[]= "abcdef";
char arr2[20] = { 0 };//开创得一个足够大的内存空间
char* p = my_strcpy(arr1, arr2);
printf("%s\n", p);
return 0;
}
2.strncpy函数
strncpy
函数是C语言中的一个标准库函数,用于将源字符串的前n个字符复制到目标字符串中。其原型定义如下:
char *strncpy(char *dest, const char *src, size_t n);
strncpy
函数从源字符串src
中最多复制n
个字符到目标字符串dest
中。如果源字符串的长度小于或等于n
,则会自动在目标字符串的末尾添加空字符'\0'
,以确保目标字符串以空字符结尾。然而,如果源字符串的长度大于n
,则不会在目标字符串末尾添加额外的空字符,因此目标字符串可能不会以空字符结尾。
接下来,我们也做一下strncpy的模拟实现来加深对它的理解
#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* src, size_t num)
{
char* ret = dest;//保存首地址
assert(dest && src);
while (num--)//复制相应个数的字符到dest中
{
*dest++ = *src++;
}
return ret;//返回得操作结果
}
int main()
{
char arr1[] = "wowowa";
char arr2[20] = "0";
my_strncpy(arr2, arr1, 6);
printf("%s", arr2);//打印结果
return 0;
}
四、strcat 函数及strncat函数
1.strcat函数
strcat
函数是C语言中的一个标准库函数,用于将两个字符串连接成一个字符串。其主要功能是将源字符串(src
)追加到目标字符串(dest
)的末尾,并在最终形成的字符串后添加一个空字符'\0'
。该函数的原型声明如下:
#include <string.h>
char *strcat(char *dest, const char *src);
使用方法;
strcat
函数的主要功能是将源字符串附加到目标字符串的末尾。具体来说,它会从目标字符串的终止空字符'\0'
位置开始,覆盖掉这个空字符,并继续将源字符串的所有字符复制到目标字符串中,直到源字符串的终止空字符'\0'
为止。
接下来我们去模拟实现它
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;//保存dest首地址
assert(dest != NULL && src != NULL);确定二者不为空
while (*dest != '\0')//循环到dest的末尾
{
dest++;
}
while (*dest++ =*src++)//从dest的末尾‘\0'开始覆盖,到src的'\0'结束
{
;
}
return ret;
}
int main()
{
char arr1[20] = "a~";//开创足够大的空间
char arr2[] = "hahaha!";
my_strcat(arr1, arr2);//创造一个函数
printf("%s", arr1);
return 0;
}
2.strncat函数
strncat
函数是C语言中的一个标准库函数,用于将源字符串的一部分追加到目标字符串的末尾。其主要功能是在目标字符串的末尾添加不超过n个字符,并在最终结果中添加一个空字符'\0'作为结束符。
char *strncat(char *dest, const char *src, size_t n);
strncat与strcat多了一个n的限制,所以在模拟实现strncat我们需要做一点小小的改变
#include<stdio.h>
#include<assert.h>
char* my_strncat(char* dest, const char* src, size_t n)
{
char* ret = dest;//保存首地址
assert(dest && src);//确定二者的内容不为空
while (*dest)//循环到dest的末尾
{
dest++;
}
while (n--)//从dest的末尾开始到src的末尾结束
{
*dest++ = *src++;
}
return ret;
}
int main()
{
char arr1[100] = "oioioioi";
char arr2[] = "haha";
my_strncat(arr1, arr2, 4);
printf("%s", arr1);
return 0;
}
五、strcmp函数及strncmp函数
1.strcmp函数
strcmp函数是C语言中用于比较两个字符串大小的标准库函数。其主要功能是逐个字符地比较两个字符串,并根据ASCII码值返回不同的结果。
#include <string.h>
int strcmp(const char *str1, const char *str2);
比较时,strcmp
函数会逐个字符地比较两个字符串中的字符,直到遇到不同的字符或者其中一个字符串结束(即遇到空字符\0
)。比较的依据是字符的ASCII码值。如果第一个字符串大于第二个字符串,则返回一个大于0的数字;如果第一个字符串等于第二个字符串,则返回0;如果第一个字符串小于第二个字符串,则返回一个小于0的数字。
我们试一试模拟实现它
#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[] = "abcw";
char arr2[] = "abc";
int ret=my_strcmp(arr1, arr2);
printf("%d", ret);
return 0;
}
2.strncmp函数
strncmp
函数是C语言标准库中的一个字符串处理函数,用于比较两个字符串的前n个字符。其主要功能是判断两个字符串在前n个字符上是否相同,并根据比较结果返回一个整数值。
#include <string.h>
int strncmp(const char *str1, const char *str2, size_t n);
接下来就是模拟实现了,strncmp的与strcmp的差不多
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2, size_t n)
{
assert(str1 && str2);
if (n == 0)
return 0;
while (n--)//增加一个while循环使只比较n次
{
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
}
return*str1 - *str2;
}
int main()
{
char arr1[] = "abcw";
char arr2[] = "abcw";
int ret = my_strcmp(arr1, arr2,3);
printf("%d", ret);
return 0;
}
六、strstr函数
strstr
是 C 语言中的一个标准库函数,用于在一个字符串中查找另一个子字符串的首次出现位置。该函数定义在<string.h>
头文件中,其原型如下:
char *strstr(const char *str1, const char *str2);
其中:
- str1:被搜索的主字符串。
- str2:要查找的子字符串。
如果找到了匹配的子字符串,strstr
返回指向子字符串首次出现位置的指针;如果没有找到,则返回 NULL
。
我们通过模拟实现来了解它吧
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && &str2);
const char* s1 = NULL;
const char* s2 = NULL;//保证原数组不改变,设定两个指针用于比较
const char* cur = str1;//设置比较对象
if (*str2 == '\0')//考虑子字符串为空的情况
{
return str1;
}
while (*cur)s1与s2跟cur比较
{
s1 = cur;
s2 = str2;
while (*s1 && *s2 && *s1 == *s2)//比较前提
{
s1++;
s2++;
}
if (*s2 == '\0')//到子字符串末尾则比较结束
return cur;
cur++;
}
return NULL;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "cde";
char * ret = my_strstr(arr1, arr2);//设置函数
if (ret == NULL)
printf("找不到");
else
printf("找到了,是;%s", ret);
return 0;
}
七、strtok函数
strtok
函数是C语言中用于将字符串分割成一系列令牌的函数,它的头文件是<string.h>
,其原型如下:
char *strtok(char *str, const char *sep);
strtok
函数的主要功能是将一个字符串按照指定的分隔符进行分割,并返回被分割出的部分。每次调用strtok
时,它都会查找并返回下一个由分隔符分隔开的子字符串,并在内部记录当前的位置,以便下一次调用时能够继续分割
#include<stdio.h>
#include<string.h>
char* my_strtok(char* str, const char* sep)
{
static char* p = NULL;
if (str)//检查str内容是否为空,否则将str赋给p
{
p = str;
}
if (p == NULL)//检查p是否为NULL
{
return NULL;
}
char* left = p;//保存首地址
while (*p)
{
for (int i = strlen(sep) - 1;i >= 0;i--)
{
if (*p == *(sep + i))//若遇到符号,则将符号转换为‘\0’
{
*p = '\0';
p++;
return left;
}
}
p++;
}
p = NULL;//便于下次使用时的初始化
return left;
}
int main()
{
char arr[] = "98745885@qq.com";
const char* p = "@.";//目标符号
char* ret = NULL;
for (ret = my_strtok(arr, p);ret != NULL;ret = my_strtok(NULL, p))//在每次循环打印出找到的子串,然后更新ret指向下一个子串的位置。
{
printf("%s\n", ret);
}
return 0;
}
八、strerror函数
strerror
函数是C语言中的一个库函数,他的头文件是errno.h, 用于将错误代码转换为相应的错误信息字符串。该函数的声明如下:
char *strerror(int errnum);
参数:errnum
:这是错误号,通常是errno
。
返回值:该函数返回一个指向错误字符串的指针,该字符串描述了错误errnum
这个函数很简单,了解这个函数我们可以写一个关于它的代码,看看它的使用过程
#include<errno.h>
#include<stdio.h>
#include<string.h>
int main()
{
for (int i = 0;i < 5;i++)
{
printf("%s\n", strerror(i));
}
return 0;
}
开始启动时,errno是0,表示没有错误,后续运行过程中发生错误时,会将对应的错误码存放在errno中,返回时将错误码对应的错误信息的错误信息字符串的地址返回(一点点拗口)。
完工,有错误或更好方法的欢迎说出来一起学习进步!