Bootstrap

字符函数,字符串函数

一.字符函数:

      C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h

    1.字符分类函数:

        运用练习:将一个字符串中的小写字母转成大写字母

          没学字符分类函数之前:

          

      学习了字符分类函数后:

       

     2.字符转换函数:

            C语⾔提供了2个字符转换函数:
                             int tolower ( int c ); // 将参数传进去的⼤写字⺟转⼩写
                             int toupper ( int c ); // 将参数传进去的⼩写字⺟转⼤写

            还是上面那个例题,我们可以用字符分类函数和字符转换函数共同完成:

           

     因为这两个字符转换函数传进去的参数是整形,所以要进行强制转换。

 二.字符串函数:

       1.strlen使用和模拟实现:

             size_t strlen ( const char * str );

            • 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个 数                  (不包 含 '\0' )。

            • 参数指向的字符串必须要以 '\0' 结束。

            • 注意函数的返回值为 size_t,是⽆符号的( 易错 )
            • strlen的使⽤需要包含头⽂件(string.h)

               1.使用:

                   

                2.模拟实现:

                     法一:计数器的方式
                   法二:函数递归的方式
 
   法三:指针-指针的方式

   

   2.strcpy使用和模拟实现:

        char* strcpy(char * destination, const char * source );

       源字符串必须以 '\0' 结束。

       • 会将源字符串中的 '\0' 拷⻉到⽬标空间。

       • ⽬标空间必须⾜够⼤,以确保能存放源字符串。
       • ⽬标空间必须可修改
       

         1.使用:

            

        2.模拟实现:

            

       3.strcat使用和模拟实现:

             • 源字符串必须以 '\0' 结束。
             • ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
             • ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
             • ⽬标空间必须可修改。

            1.使用:

             

           2.模拟实现:

       

    4.strcmp的使用和模拟使用:

        标准规定:

             第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字

             ◦ 第⼀个字符串等于第⼆个字符串,则返回0

             ◦ 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
            ◦ 那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。

               并不是比较字符串的长度是比较对应位置字符的ASCII码值的大小。

          1.strcmp使用:

               

            2.strcmp的模拟使用:

           

     5.strncpy的使用:

       • 拷⻉num个字符从源字符串到⽬标空间。
       • 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。

        

  

这就是源字符串小于num的情况,会自动补上'\0'.

6.strncat的使用:

   将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0

   如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。

7.strncmp的使用:

     int strncmp ( const char * str1, const char * str2, size_t num );

     ⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0

     8.strstr的使用和模拟实现:

           char * strstr ( const char * str1, const char * str2);

          函数返回字符串str2在字符串str1中第⼀次出现的位置。

          字符串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志。

          1.strstr的使用:

              

     当strstr函数在一个个比较你要找的字符后当都符合时就记住所找到的位置并往后打印直到有'\0'的位置。

       2.strstr的模拟实现:

        对于字符串中找字符串有三种不同的情况与之对应:

       首先分析最简单的情况:

       

      当首地址传过来的时候,就开始比较,这时指向的字符相等故分别向后走,走到最后有'\0‘的位置。但当str1往后走的时候str1指向的内容发生了变化所以得出一个结论要一个指针变量记录开始的位置

    

      然后分析复杂的情况(存在多次匹配):

     

  因为一开始指向的字符不相等所以str2指向的不能动,而str1往后走找到b此时相等,所以str1与str2都向后走此时两个指向的字符也都是b,所以再次往后走,但是此时str1指向的是b,str2指向的是c此时两个指向不相等了。因为一开始str1从a指向开始向后找没找到,所以str1此时要从下一个字符为起始位置开始向后寻找,所以需要一个指针变量来记录str1开始匹配的位置。此时str2的位置也改变了,所以还需要一个指针变量记录str2的起始位置。

     根据分析上面两种情况可得出的结论:

           函数里要有三个不同的指针变量,一个指向str1的起始位置,一个指向str1开始匹配的位置

      一个指向str2的起始位置。

      

       9.strtok的使用:

          char * strtok ( char * str, const char * sep);

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

  10.strerror 函数的使用:

      char * strerror ( int errnum );

         strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
        在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明 的,C语⾔程序启动的时候就会使⽤⼀个全局的变量errno来记录程序的当前错误码,只不过程序启动 的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
         当我们打开errno.h的文件时可以看到不同的错误码:
          
 
;