本篇博客介绍C语言当中的字符函数和字符串函数
一、字符分类函数:判断一个字符属于什么类型,需要包含头文件“ctype.h”
1.举例说明:islower函数,判断参数部分的c是否是小写字母 如果是小写字母:返回非零整数;不是小写字母:返回0
2.例子:写一个代码,将字符串中的小写字母转大写,其它字符不变
#include <stdio.h>
#include <ctype.h>
int main ()
{
int i = 0;
char str[] = "Test String.\n";
char c;
while (str[i])
{
c = str[i];
if (islower(c))
c -= 32;
putchar(c);
i++;
}
return 0;
}
二、字符转换函数(两个)
#include <stdio.h>
#include <ctype.h>
int main ()
{
int i = 0;
char str[] = "Test String.\n";
char c;
while (str[i])
{
c = str[i];
if (islower(c))
c = toupper(c); //可进行更改
putchar(c);
i++;
}
return 0;
}
三、strcpy,strcat,strcmp的使用和模拟实现
1.strcpy的使用和模拟实现
(1)注意事项
①源字符串必须以’\0’结束
②会将源字符串的’\0’拷贝到目标空间
③目标空间必须足够大且可修改
(2)模拟实现
①版本1
#include<assert.h>
void my_strcpy(char* dest, const char* src)
{
assert(src != NULL);
assert(dest != NULL);
//拷贝\0前面的内容
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = *src;//拷贝\0
}
注意:为保证指针的安全性,可进行assert断言
②版本2
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(src != NULL);
assert(dest != NULL);
char* ret = dest;
//拷贝\0前面的内容
while (*dest++ = *src++)//此处进行了升级
{
;
}
return ret;//返回destination的起始地址
}
2.strcat(连接/追加字符串)的使用和模拟实现
(1)注意事项
①源字符串必须以’\0’结束
②目标字符串当中也得有’\0’,否则不知道从哪里开始追加
③目标空间必须足够大且可修改
(2)模拟实现
①函数返回目标空间的起始地址
②找到目标空间的\0
③拷贝数据(在\0后面追加)
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;//保存目标空间的起始地址
//1. 找打目标空间的\0
while (*dest != '\0')
dest++;
//2. 拷贝
while (*dest++ = *src++)
;//空语句
return ret;
}
注意:对于my_strcat:如果自己给自己追加,则会有死循环+非法访问内存,而VS提供的库函数库函数本身没问题
3.strcmp的使用和模拟实现
(1)strcmp库函数解析
① 标准规定
第一个字符串大于第二个字符串,返回大于0的数字(VS返回1)
第一个字符串等于第二个字符串,返回0(VS返回0)
第一个字符串小于第二个字符串,返回小于0的数字(VS返回-1)
② 判断逻辑:遇到第一个可以分出大小的字符就返回值
(2)strcmp的模拟实现
int my_strcmp (const char * str1, const char * str2)
{
int ret = 0 ;
assert(src != NULL);
assert(dest != NULL);
while(*str1 == *str2)
{
if(*str1 == '\0') //*str1==*str2,字符串比较完成,结果是相等
return 0;
str1++;
str2++;
}
return *str1-*str2;
}
四、strncpy,strncat,strncmp的使用
1.strncpy函数的使用
(1)从源字符串拷贝num个字符到目标空间
(2)如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加0,直到凑齐num个
2.strncat函数的使用
(1)将源字符串的前num个字符追加到destination的字符串末尾,再追加一个\0
(2)如果源字符串长度小于num,只会将全部源字符串(含\0)追加,不补0
效果:把abc进行追加,从arr1里面找3个字符
效果:把abcdef进行追加,源字符串全部追加(含\0),不补0
3.strncmp函数的使用
比较str1和str2前num个字符(最多比较num个),其它同strcmp
五、strstr(字符串匹配函数)的使用和模拟实现
1.strstr函数解析
(1)在str1里面找str2第一次出现的位置,若没找到,返回NULL
(2)函数返回str2在str1中第一次出现的位置
(3)字符串匹配不包含\0,以\0作为结束标志
#include<stdio.h>
int main()
{
char arr1[]="this is an apple\n";
char arr2[]="is";
char*ret=strstr(arr1,arr2);
if(ret!=NULL)
{
printf("%s\n",ret);```
}
else
{
printf("找不到\n");
}
输出结果:is is an apple
2.strstr的模拟实现
六、strtok(字符串切分函数)的使用
1.sep指向一个字符串,该字符串包含了用作分隔符的字符集合(无需在意分隔符排列顺序)
2.str指向待切分的字符串
3.strtok找到str中的下一个标记,并将其用\0结尾,返回一个指向该标记的指针(strtok函数会修改被操作的字符串,所以被切分字符串一般是临时拷贝内容且可被修改)
4.*str不为NULL,函数将找到str中第一个标记,保存它在字符串中的位置
5.*str==NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记
6.若字符串中不存在更多的标记,则返回NULL
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "192.168.6.111";
char* sep = ".";
char* str = NULL;
for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
{
printf("%s\n", str);
}
return 0;
}
七、strerror(打印错误码)的使用
1.strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
2.在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
FILE*pfile;
pfile=fopen("unexsist.ent","r");
if(pFile==NULL)
perror("Error openning file unexsist.ent");
return 0;
}
输出:Error opening file unexist.ent: No such file or directory
perror:打印完参数部分的字符串后,再打印一个冒号和一个空格,再打印错误信息