字符函数和字符串函数

目录

一:字符分类函数

二:字符转换函数

三:strlen函数的模拟和实现

3.1strlen函数的介绍和使用

3.2strlen函数的模拟实现

四:strcpy函数的使用和模拟

4.1strcpy函数的介绍和使用

4.2strcpy的模拟实现

五:strcat函数的使用和模拟

5.1strcat函数的使用

5.2strcat函数的模拟

六:strcmp函数的使用和模拟

6.1strcmp函数的介绍和使用

6.2strcmp函数的模拟

七:strncpy函数的使用和模拟

7.2strncpy函数的模拟

八:strncat函数的使用和模拟

8.1strncat函数的使用

8.2strncat函数的模拟

九:strncmp函数的使用

十:strstr的使用和模拟实现

10.1 strstr函数的介绍和使用

10.2strstr函数的模拟实现

十一:strtok函数的使用

十二:strerror函数的使用


  在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了一系列库函数,接下来我将讲解一下这些函数的基本用法。

一:字符分类函数

C语言中有⼀系列的函数是专门做字符分类的,也就是⼀个字符是属于什么类型的字符的。
这些函数的使用都需要包含⼀个头文件是 ctype.h
函数 如果它的参数符合下列条件就返回真
iscntrl 任何控制字符
isspace 空白字符:空白‘ ’,换页‘\f’, 换行‘\n’, 回车‘\r’, 制表符‘\t’, 或者垂直制表符‘\v’
isdigit 十六进制数字‘0’~‘9’(字符)
isxdigit 十六进制数字,包括所有十进制数字,小写字母:a~z,大写字母:A~Z
islower 小写字母a~z
isupper 大写字母A~Z
isalpha 小写字母a~z或者大写字母A~Z
isalnum 字母或者数字,a~z,A~Z,0~9
ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraphy 任何图形字符
isprint 任何可打印字符,包括图形字符和空白字符

这些函数的使用方法非常类似,我们就举例⼀个函数的事情,其他的非常类似:
  islower 是能够判断参数部分的 c 是否是小写字母的。
  通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回0。
练习:
写⼀个代码,将字符串中的小写字母转大写,其他字符不变。
字符函数和字符串函数_第1张图片

二:字符转换函数

C语言提供了2个字符转换函数:
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写 
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
  上面的代码,我们将小写转大写,是-32完成的效果,有了转换函数,就可以直接使用  toupper 
数。
字符函数和字符串函数_第2张图片

三:strlen函数的模拟和实现

3.1strlen函数的介绍和使用

字符函数和字符串函数_第3张图片

size_t strlen ( const char * str );
字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包
'\0' )。
参数指向的字符串必须要以 '\0' 结束。
注意函数的返回值为size_t,是无符号的( 易错 )

strlen的使用需要包含头文件

使用:

#include 
#include 
int main()
{
 const char* str1 = "abcdef";
 const char* str2 = "bbb";
 if(strlen(str2)-strlen(str1)>0)
 {
 printf("str2>str1\n");
 } 
 else
 {
 printf("srt1>str2\n");
 }
 return 0;
}

上述代码,大家认为结果是什么?str1的长度是6,而str2的长度是3,那么strlen(str2)-strlen(str1)的结果应该是-3,那就应该是走else语句,那结果真的是这样吗?

字符函数和字符串函数_第4张图片

通过打印结果可以看出,走的是if语句,这是为什么呢?因为strlen函数的返回值是无符号型整数,那么-3作为无符号整数时是非常大的整数,那么自然就会走if语句,如果想要得到正确答案,需要将strlen的结果强制转化成int型

字符函数和字符串函数_第5张图片

3.2strlen函数的模拟实现

字符函数和字符串函数_第6张图片


四:strcpy函数的使用和模拟

4.1strcpy函数的介绍和使用

字符串的拷贝

字符函数和字符串函数_第7张图片

char* strcpy(char * destination, const char * source );
Copies the C string pointed by source into the array pointed by destination, including the
terminating null character (and stopping at that point).
源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷贝到目标空间。
标空间必须足够大,以确保能存放源字符串。
标空间必须可修改。
头文件
字符函数和字符串函数_第8张图片

4.2strcpy的模拟实现

字符函数和字符串函数_第9张图片


五:strcat函数的使用和模拟

5.1strcat函数的使用

字符串的拷贝

字符函数和字符串函数_第10张图片

Appends a copy of the source string to the destination string. The terminating null character
in destination is overwritten by the first character of source, and a null-character is included
at the end of the new string formed by the concatenation of both in destination.
源字符串必须以 '\0' 结束。
目标 字符串中也得有 \0 ,否则没办法知道追加从哪里开始。
目标 空间必须有足够的大,能容纳下源字符串的内容。
目标 空间必须可修改。
字符串自己给自己追加,如何?
   1.找到目标字符串的'\0'
    2.拷贝源头字符串的数据找到目标空间的'\0'的位置以及后面空间
字符函数和字符串函数_第11张图片

5.2strcat函数的模拟

字符函数和字符串函数_第12张图片


六:strcmp函数的使用和模拟

6.1strcmp函数的介绍和使用

字符串比较

字符函数和字符串函数_第13张图片

字符函数和字符串函数_第14张图片

This function starts comparing the first character of each string. If they are equal to each
other, it continues with the following pairs until the characters differ or until a terminating
null-character is reached.
标准规定:
第⼀个字符串大于第二个字符串,则返回大于0的数字
第⼀个字符串等于第二个字符串,则返回0
第⼀个字符串小于第二个字符串,则返回小于0的数字
那么如何判断两个字符串?
   比较两个字符串中对应位置上字符ASCII码值的大小。
字符函数和字符串函数_第15张图片

6.2strcmp函数的模拟

字符函数和字符串函数_第16张图片


七:strncpy函数的使用和模拟

7.1strncpy函数的介绍

char * strncpy ( char * destination, const char * source, size_t num );
字符函数和字符串函数_第17张图片
Copies the first num characters of source to destination. If the end of the source C string
(which is signaled by a null-character) is found before num characters have been copied,
destination is padded with zeros until a total of num characters have been written to it.
拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
字符函数和字符串函数_第18张图片

7.2strncpy函数的模拟

字符函数和字符串函数_第19张图片


八:strncat函数的使用和模拟

8.1strncat函数的使用

char * strncat ( char * destination, const char * source, size_t num );

字符函数和字符串函数_第20张图片

Appends the first num characters of source to destination, plus a terminating null-character.
(将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0
符)。
If the length of the C string in source is less than num, only the content up to the terminating
null-character is copied.(如果source 指向的字符串的长度小于num的时候,只会将字符串中到
\0 的内容追加到destination指向的字符串末尾)。
字符函数和字符串函数_第21张图片

8.2strncat函数的模拟

字符函数和字符串函数_第22张图片


九:strncmp函数的使用

字符函数和字符串函数_第23张图片

int strncmp ( const char * str1, const char * str2, size_t num );
比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字母,如果提前发现不一样,就提前结束,大的字符所在的字符串大于另外⼀个。如果num个字符都相等,就是相等返回0.
   

十:strstr的使用和模拟实现

10.1 strstr函数的介绍和使用

在一个字符串中找另一个字符串

char * strstr ( const char * str1, const char * str2);
Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1.
(函数返回字符串str2在字符串str1中第⼀次出现的位置)。
The matching process does not include the terminating null-characters, but it stops there.(字符
串的较比匹配不包含 \0 字符,以 \0 作为结束标志)。

字符函数和字符串函数_第24张图片

10.2strstr函数的模拟实现

字符函数和字符串函数_第25张图片

字符函数和字符串函数_第26张图片


十一:strtok函数的使用

char * strtok ( char * str, const char * sep);
sep参数指向⼀个字符串,定义了作用分隔符的字符集合
第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标
记。
strtok函数找到str中的下⼀个标记,并将其用 \0 结尾,返回⼀个指向这个标记的指针。
(注strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串⼀般都是临时拷贝的内容并且可修改。)
strtok函数的第⼀个参数不为NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串
中的位置。
strtok函数的第⼀个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下⼀个标
记。
如果字符串中不存在更多的标记,则返回 NULL 指针。

字符函数和字符串函数_第27张图片

还可以用循环

字符函数和字符串函数_第28张图片


十二:strerror函数的使用

char * strerror ( int errnum );
   strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
   在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在 errno.h 这个头文件中说明的,C语言程序启动的时候就会使用⼀个全面的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会讲对应的错误码,存放在errno中,而⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
#include 
#include 
#include 
//我们打印⼀下0~10这些错误码对应的信息
int main()
{
     int i = 0;
     for (i = 0; i <= 10; i++) 
    {
         printf("%s\n", strerror(i));
    }
     return 0;
}

字符函数和字符串函数_第29张图片

举例:

#include 
#include 
#include 
int main ()
{
 FILE * pFile;
 pFile = fopen ("unexist.ent","r");
 if (pFile == NULL)
 printf ("Error opening file unexist.ent: %s\n", strerror(errno));
 return 0;
}

输出:Error opening file unexist.ent: No such file or directory
   也可以了解⼀下perror函数,perror 比特就业课主页 函数相当于一次将上述代码中的第9行完成了,直接将错误信息打印出来。perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
#include 
#include 
#include 
int main ()
 {
     FILE * pFile;
     pFile = fopen ("unexist.ent","r");
     if (pFile == NULL)
        perror("Error opening file unexist.ent");
     return 0;
 }
输出:Error opening file unexist.ent: No such file or directory

对于strerror函数的相关代码,不需要完全现在就非常理解,只要从中理解到它的作用就可以了


你可能感兴趣的:(C语言知识点,visual,studio,算法,c语言,学习方法,开发语言)