C语言中的字符函数和字符串函数

1. 字符分类函数

        C语言中有一系列的函数是专门做字符分类的,这些函数的使用都需要包含一个头文件ctype.h

        这些函数的使用都是类似的,下面举一个例子:

int islower (int c);

        islower是能够判断参数部分的c是否是小写字母的。通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回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 -= 32;  //因为大写字母和小写字母之间的ASCLL码值差32,所以小写转大写则减32
        }
        putchar(c); //将转换后的字符输出到屏幕
        i++;
    }
}

2. 字符转换函数

        C语言提供了2个字符转换函数:

int tolower (int c); //将参数传进去的大写字母转小写
int toupper (int c); //将参数传进去的⼩写字⺟转⼤写

        有了转换函数就不用通过-32来实现小写转大写了。

#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;
}

3. strlen的使⽤和模拟实现

3.1函数原型

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

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

        函数的返回值为size_t,是无符号的。

        所以关于字符串的函数,都需要包含头文件string.h。

3.2strlen的使用

#include <stdio.h>
#include <string.h>
int main()
{
    const char* str1 = "abcdef";
    const char* str2 = "bbb";
    int i = strlen(str2)-strlen(str1);
    if(i > 0) //这里不能之间用strlen(str2)-strlen(str1)来进行判断,因为返回值是size_t,这个类型
    {         //运算之后也是size_t类型的值,所以会永远大于0
        printf("str2>str1\n");
    } 
    else
    {
        printf("srt1>str2\n");
    }
    return 0;
}

3.3strlen的模拟实现

//方法1--计算器方式
int my_strlen(const char* str)
{
    int count = 0;
    assert(str); //断言str是否为空指针
    while(*str) //因为'\0'对应的值就是0,所以*str等同于 *str != '\0'
    {
        count++;
        str++;   
    }
    return count;
}

//方法2--不能创建临时变量计数器--递归的方法
int my_strlen(const char* str)
{
    assert(str);
    if (*str == '\0')
        return 0;
    else
        return 1+my_strlen(str+1);
}

//方法3--指针减指针的方法
int my_strlen(char* s)
{
    assert(s);
    char* p = s;
    while(*p != '\0')
        p++;
    return p-s;
}

4. strcpy的使⽤和模拟实现

4.1函数模型

        将source所指向的字符串copy到destination指向的空间中。

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

        会将源字符串中的'\0'拷贝到目标空间。

        目标空间必须足够大,以确保能存放源字符串。

        目标空间必须可修改。

4.2strcpy的模拟实现

char* my_strcpy(char* dest, const char* src)
{
    cahr* ret = dest;
    assert(dest != NULL);
    assert(src != NULL);

    while((*dest++ = *src++)) //将src指向的值赋值到dest指向的地址,然后dest和src都加1
    {                         //当为'\0'时先进行赋值然后再判断,所以'\0'也复制了
        ;
    }

    return ret; //返回原始dest的地址
}

5. strcat的使⽤和模拟实现

5.1函数模型

        上述函数是将source指向的字符串追加到destination的后面。库函数中的strcat可以自己给自己追加。

#include <stdio.h>
#include <string.h>

int main()
{
    char arr[20] = "hello.";
    strcat(arr, arr);
    printf("%s ", arr);

    return 0;
}

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

        目标字符串中也得有'\0',否则没办法知道追加从哪里开始。

        目标空间必须足够的大,能容纳下源字符串的内容。

        目标空间必须可修改。

5.2strcat的模拟实现

        现阶段实现的strcat不能给自己追加,因为前面追加的会把目标最后的'\0'覆盖掉,导致一直找不到最后的'\0'。

char* my_strcat (char* dest, const char* src)
{
    char* ret = dest;
    assert(dest);
    assert(src);

    while(*dest)
    {
        dest++:    
    }

    while((*dest++ = *src++))
    {
        ;
    }

    return ret;
}

6. strcmp的使⽤和模拟实现

6.1函数模型 

        上述函数的功能是比较两个字符串的大小

标准规定:

        第一个字符串大于第二个字符串,则返回大于0的数字

        第一个字符串等于第二个字符串,则返回0

        第一个字符串小于第二个字符串,则返回小于0的数字 

比较规则:

        比较两个字符串中对应位置上字符ASCLL码值的大小。并不是比较两个字符串的长度。

6.2strcmp函数的模拟实现 

int my_strcmp(const char* str1, const char* str2)
{
    int ret = 0;
    assert(str1 != NULL);
    assert(str2 != NULL);

    while (*str1 == *str2) //判断对应位置字符是否相等,不相等时跳出循环
    {
        if (*str1 == '\0') //再第一个字符串和第二个字符相等的情况下都走到"\0"
            return 0;
        str1++;
        str2++;
    }

    return *str1 - *str2;
}

7. strncpy函数的使⽤

        从源字符串拷贝num个字符到目标空间。

        如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加0,直到num个。 

8. strncat函数的使⽤

         将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加一个'\0'字符。如果source指向的字符串的长度小于num的时候,只会将字符串中到'\0'的内容追加到destination指向的字符串末尾。

9. strncmp函数的使⽤

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

10. strstr的使⽤和模拟实现

10.1函数模型

        上述函数的功能是查找str2是否在str1中出现过,若出现过,则返回str2在str1中第一次出现的首字符的地址,字符串的比较匹配不包含'\0',以'\0'作为结束标志。

10.1strstr的使用

#include <stdio.h>
#include <string.h>
int main()
{
    char str[] = "This is a simple string";
    char* pch;
    pch = strstr(str, "simple"); //pch指向字符's'的位置
    printf("%s\n", pch);
    return 0;
}

 10.2strstr的模拟实现

        分析可能出现的情况:

#include <stdio.h>

char* strstr(const char* str1, const char* str2)
{
    const char* s1 = NULL;
    const char* s2 = NULL;
    const char* cur  = str1; //初始化cur,指向str1的第一个位置

    if (*str2 = '\0')  //如果str2是空字符串,直接返回str1
        return (char*)str1;

    while(*cur) //让cur一直走(cur是str1中开始匹配的位置),当cur走到str1的'\0'跳出循环
    {
        s1 = cur;
        s2 = str2;
        while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0') //s1和s2指向的位置相等且不为'\0'则继                
                                                         //续比较下一个位置
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
            return (char*)cur;
        cur++;
    }
    return NULL;
}

int main()
{
    char str[] = "This is a simple string";
    char* pch;
    pch = my_strstr(str, "simple"); //pch指向字符's'的位置
    printf("%s\n", pch);
    return 0;
}

11. strtok函数的使⽤

11.1函数模型

        上述函数的功能是通过sep中包含的字符来分割str中的字符串

        sep参数指向一个字符串,定义了用作分割符的字符集合

        strtok函数找到str中的下一个标记,并将其用'\0'结尾,返回一个指向这个标记的指针。

        strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

        strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存,查找下一个标记。如果不存在更多的标记,则返回NULL。

11.2strtok的使用

#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;
}

12. strerror函数的使⽤

12.1函数模型

         strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

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

12.2strerror的使用

#include <errno.h>
#include <string.h>
#include <stdio.h>
//我们打印⼀下0~10这些错误码对应的信息
int main()
{
    int i = 0;
    for (i = 0; i <= 10; i++) 
    {
        printf("%s\n", strerror(i));
    }
    return 0;
}

 

  • 36
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值