目录
1.字符函数
1.1字符分类函数
函数 | 如果参数符合下列条件就返回真 |
iscntrl | 任何字符 |
isdigit | 十进制的数字(0~9) |
isxdigit | 十六进制的数字(所有的十进制数字,a~f,A~F) |
isspace | 空白字符(空格‘ ’,换页‘\f’,换行‘\n’,回车‘\r’,制表符‘\t’或垂直制表符‘\v’) |
islower | 小写字母a~z |
isupper | 大写字母A~Z |
isalpha | 字母(包括大写和小写) |
isalnum | 字母和数字(包括大小写字母和0~9) |
ispunct | 标点符号 |
isgraph | 任何图形字符 |
isprint | 任何可打印字符(图形字符和空白字符) |
使用这些函数都需要一个头文件<ctype.h>。
1.2字符转换函数
int tolower(int c);//将参数传进去的大写字母转为小写
int toupper(int c);//将参数传进去的小写字母转为大写
2.字符串函数
<assert.h>头文件定义了宏assert( ),在运行时可以确保程序符合指定的条件,如果不符合条件,就会报错终止运行。(缺点是加入了额外的检查,增加了程序运行的时间)
2.1strlen函数
size_t strlen(count char* str);
1.返回字符串str的长度,函数的返回值是size_t(无符号);
2.字符串的长度由终止字符NULL决定,字符串的长度等于字符串开头和终止字符NULL之间的字符数(不包括NULL本身);
3.使用需包括头文件<string.h>。
模拟实现
方法一:
//不能创建临时变量计数器
int my_strlen(const char* str)
{
assert(str);
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str + 1);
}
方法二:
//计数器
int my_strlen(const char* str)
{
assert(str);
int count = 0;
while (*str)
{
count++;
*str++;
}
return count;
}
方法三:
//指针-指针
int my_strlen(const char* str)
{
assert(str);
char* p = str;
while (*p != '\0')
{
*p++;
}
return p - str;
}
2.2strcpy函数
char* strcpy(char* destination,const char* source);
1.将source指向的字符串复制到destination指向的数组中(把源头的数据拷贝到目的地的空间),包括终止字符NULL并在该点停止;
2.会将源字符串中的'\0'拷贝到目标空间;
3.为了避免溢出,destination指向的数组的大小应足够大,以包含与source相同的字符串(包括终止字符NULL),并且不应在内存中与source重叠;
4.目标空间必须可以修改;
5.使用需包括头文件<string.h>。
模拟实现
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest++ = *src++)
;
return ret;
}
2.3strcat函数
char* strcat(char* destination,const char* source);
1. 将源字符串的副本追加到目标字符串中,destination中的终止字符NULL将被source的第一个字符覆盖,并且NULL包含在destination中形成新字符串的末尾;
2.destination和source不能重叠;
3.目标字符串中也需要有'\0',否则不知道追加从哪开始(找到目标空间末尾的'\0');
4.目标空间需要足够大,能容纳源字符串的内容;
5.目标空间必须可以修改;
6.使用需包括头文件<string.h>。
模拟实现
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
;
return ret;
}
2.4strcmp函数
int strcmp(const char* str1, const char* str2);
1.将字符串str1与字符串str2进行比较;
2.此函数开始比较每个字符串的第一个字符,如果它们彼此相等,则继续往下处理,直到字符不同或者遇到终止字符NULL;
3.比较两个字符串中对应位置上的字符ASCLL码值大小;
4.使用需包括头文件<string.h>。
返回值 | 表明 |
>0 | 第一个字符串大于第二个字符串 |
0 | 第一个字符串等于第二个字符串 |
<0 | 第一个字符串小于第二个字符串 |
模拟实现
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
if (*str1 > *str2)
return 1;
else
return -1;
}
最后也可以写为
return *str1-*str2;
2.5strncpy函数
char* strncpy(char* destination, const char* source, size_t num);
1. 从源字符串拷贝num个字符到目标空间;
2.如果在复制num个字符之前找到源字符串的末尾(由NULL表示),就是源字符串的长度小于num,则拷贝完源字符串之后,在目标后面填充0,直到写入总数num个字符为止(多了后面的字节数,需要拷贝多少就拷贝多少,没有内容就用'\0'补充);
3.如果source长于num,则不会在destination的末尾附加NULL,因此在这种情况下,destination不应被视为不应被视为以NULL结尾的字符串(所以读取它会溢出);
4.destination和source不应重叠;
5.使用需包括头文件<string.h>。
2.6strncat函数
char* strncat(char* destination, const char* source, size_t num);
1.将source指向的字符串的前num个字符追加到destination指向的字符串末尾,在追加一个'\0';
2.如果source指向的字符串长度小于num时,只会将字符串中到'\0'的内容追加到destination指向的字符串末尾;
3.末尾的'\0'是补上的,作为结束的标志;
4.使用需包括头文件<string.h>。
2.7strncmp函数
int strncmp(const char* str1, const char* str2, size_t num);
1.比较str1和str2的前num个字符;
2.如果相等就继续往后比较,最多比较num个字符,如果提前发现不一样,就会提前结束;
3.如果num个字符都相等,就返回0;
4.使用需包括头文件<string.h>。
2.8strstr函数
char* strstr(const char* str1, const char* str2);
1.查找子串,通过一个字符串来找另一个字符串;
2.返回指向str1中第一次出现的str2的指针,如果str2不是str1的一部分,则返回NULL指针;
3.字符串的匹配不包含'\0',以'\0'作为结束标志;
4.使用需包括头文件<string.h>。
查找的过程中会出现两种情况:
情况一:匹配一次就能找到;
情况二:匹配多次才能找到,多次匹配开始匹配的时候需要记住可能匹配成功的位置,如果匹配不成功指向str1的指针就挪到可能匹配成功的下一位(因为第一次匹配的位置已经没有意义),指向str2的指针就挪到第一位开始重新匹配。
模拟实现
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 = str1;
const char* s2 = str2;
const char* p = str1;
while (*p)
{
s1 = p;//进入循环后开始赋值
s2 = str2;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)//要是两个字符串等于'\0'了,就不能往后走了
{
s1++;
s2++;
}
if (*s2 == '\0')//说明这个字符串找到了,需要拦截一下,然后返回起始位置
{
return p;
}
p++;
}
return NULL;//找不到返回空指针
}
2.9strtok函数
char* strtok(char* str,const char* delimiters);
1. 切割字符串,delimiters指向一个字符串,定义了用作分隔符的字符集合;
2.在第一次调用时,该函数需要一个字符串作为str的参数,其第一个字符用作扫描标记的起始位置;在后续的调用中,该函数需要一个NULL指针,并使用最后一个标记结束后的位置作为扫描的新起始位置;
3.如果strtok函数的第一个参数为NULL,函数将在同一个字符串中保存的位置开始,查找下一个标记;如果第一个参数不为NULL,函数将找到str中的第一个标记,函数将保存它在字符串中的位置;
4.如果字符串中没有更多标记,则返回空指针;
5.使用需包括头文件<string.h>。
2.10strerror函数
char* strerror(int errnum);
1.获取指向错误消息字符串的指针,生成一个字符串,其中包含一条描述错误条件的消息;
2.返回的指针指向静态分配的字符串,该程序不能修改字符串;
3.对此函数的进一步调用可能会覆盖其内容(不需要特定的库实现来避免数据竞争);
4.C语言的库函数,在执行失败时都会设置错误码,在不同的系统和C语言标准库的实现中都规定了一些错误码(都有对应的错误信息),一般会放在<errno.h>这个头文件中说明,errno是C语言设置的一个全局的错误码存放的变量;
5.使用需包括头文件<string.h>。