当前位置: 首页 > news >正文

C语言字符函数和字符串函数(1)

目录

前言

一、字符分类函数

1.常用的字符分类函数及其功能:

2.这些函数的返回值规则:

3.使用示例:

二、字符转换函数

1.C语⾔提供了2个字符转换函数:

三、strlen函数

1.介绍

2.模拟实现:

四、strcpy函数

1.介绍

2.模拟实现:

五、strcat函数

1.介绍

2.模拟实现:

六、strcmp函数

1.介绍

2.strcmp函数的模拟实现:指针法:

总结


前言

在编程时,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。

本文章将讲解内容如下:

1. 字符分类函数
2. 字符转换函数
3. strlen的使用和模拟实现
4. strcpy的使用和模拟实现
5. strcat的使用和模拟实现
6. strcmp的使用和模拟实现
7. strncpy函数的使用
8. strncat函数的使用
9. strncmp函数的使用
10. strstr的使用和模拟实现
11. strtok函数的使用
12. strerror函数的使用

本篇文章为1~6的讲解,下半部分会在C语言字符函数和字符串函数(2)中讲解。

一、字符分类函数

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

#include<ctype.h>

1.常用的字符分类函数及其功能:

以下是常用的字符分类函数及其功能:

  1. 判断字母和数字

    • int isalnum(int c):检查字符是否为字母(a-z, A-Z)或数字(0-9)
    • int isalpha(int c):检查字符是否为字母(a-z, A-Z)
    • int isdigit(int c):检查字符是否为数字(0-9)
  2. 判断大小写字母

    • int islower(int c):检查字符是否为小写字母(a-z)
    • int isupper(int c):检查字符是否为大写字母(A-Z)
  3. 判断空白字符

    • int isspace(int c):检查字符是否为空白字符(空格、制表符\t、换行符\n等)
  4. 判断其他属性

    • int iscntrl(int c):检查字符是否为控制字符(如\n\t等)
    • int isgraph(int c):检查字符是否为可打印且非空格字符
    • int isprint(int c):检查字符是否为可打印字符(包括空格)
    • int ispunct(int c):检查字符是否为标点符号
    • int isxdigit(int c):检查字符是否为十六进制数字(0-9, a-f, A-F)

2.这些函数的返回值规则:

如果条件满足,即函数对应的要求成立,返回非0值,不符合,返回0.

3.使用示例:

这些函数的使⽤⽅法⾮常类似:

int islower ( int c );

通过此函数,判断参数c是否为小写字母,如果条件满足,即函数对应的要求成立,返回非0值,不符合,返回0.

习题例子:

写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。

#include<stdio.h>
#include<ctype.h>
int main()
{
    char p[]="ABCdef";
    int i=0;
    char c;
    while(p[i]!='\0')
    {
        c=p[i];
        if(islower(p[i]))
           {
               c-=32;
               p[i]=c;
           }
            i++;
    }
    printf("%s",p);
}

如果记不住这些函数也没太大影响,如上方的islower,我们可以用   if(p[i]>='a'&&p[i]<='z') 来代替,同理,其他函数均可这样做。

二、字符转换函数

1.C语⾔提供了2个字符转换函数:

1. int tolower (int c)

2. int toupper(int c)

int tolower (int c)函数的作用为将大写字母转化成小写字母;

同理 int toupper(int c)函数的作用为将小写字母转化成大写字母;

上方习题中c-=32;我们可以用toupper(c)来实现;当然我们如果记不住字符转换函数的话,就记一下每个大写字母与其对应的小写字母之间差32个ASCLL值即可。

三、strlen函数

1.介绍

size_t strlen ( const char * str );

统计参数指向的字符串的⻓度。统计的是字符串中 '\0' 之前的字符的个数,如果该字符串没有‘\0’,该结果为随机值:

int main()
{
    char p[]="ABCdef";
    int i,j;
    char q[]={'a','b'};
    i=strlen(p);
    j=strlen(q);
    printf("%d  %d",i,j);
}

我们由此可知:p达到了预期的目标,但q没有。

2.模拟实现:

该函数可有多钟实现方式:
指针法:

int mystrlen(char *p)
{
    char *q=p;
    while(*q)
    {  q++;
    }
    return q-p;
}
int main()
{
    char p[]="ABCdef";
    int i,j;
    i=mystrlen(p);
    printf("%d",i);
}
 

统计个数求法:

int mystrlen(char *p)
{
    int i=0;
    while(*p)
    {
        p++;
        i++;
    }
    return i;
}
int main()
{
    char p[]="ABCdef";
    int i,j;
    i=mystrlen(p);
    printf("%d",i);
}

递归求法:

int mystrlen(const char * str)
{
    assert(str);
    if(*str == '\0') 
        return 0;
    else return 1 + mystrlen(str+1);
}
int main()
{
    char p[]="ABCdef";
    int i,j;
    i=mystrlen(p);
    printf("%d",i);
}

结果也一样正确。

四、strcpy函数

1.介绍

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

功能:字符串拷⻉,拷⻉到源头字符串中的 \0 为⽌,即将代码中source的字符全拷贝至 destination中。

destination :指针,指向⽬的地空间(目的字符串)

source :指针,指向源头数据(源头字符串)

返回值:strcpy 函数返回的⽬标空间的起始地址

int main()
{
    char arr1[10] = {0};
    char arr2[] = "hello";
    strcpy(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

我们由此可知:该函数将arr2的内容拷贝到了arr1中。

注意:

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

2.该函数会将源字符串中的 '\0' 拷⻉到⽬标空间。

3.⽬标空间必须⾜够⼤,以确保能存放源字符串。

4.⽬标空间必须可修改,常量字符串进行拷贝是不行的。

2.模拟实现:

指针法:

char* mystrcpy(char *a1, char*a2)
{  char *ret=a1;
 while(*a2)
 {
     *a1=*a2;
     a1++,a2++;
 }
 *a1 = '\0';
 return ret;
}
int main()
{
    char arr1[10] = {0};
    char arr2[] = "hello";
    mystrcpy(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

运行结果一样的。

五、strcat函数

1.介绍

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

功能:字符串追加,将源头字符串中的全部字符,即将代码中source的字符全追加至 destination结尾。

destination :指针,指向⽬的地空间

source :指针,指向源头数据

返回值rcat 函数返回的⽬标空间的起始地址

int main()
{
    char arr1[20] = "hello ";
    char arr2[] = "world";
    strcat(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

我们由此可知:该函数将arr2的内容追加到了arr1中。

注意:

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

2.⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。

3.⽬标空间必须⾜够⼤,以确保能存放源字符串。

4.⽬标空间必须可修改,常量字符串进行拷贝是不行的。

这几条要求与strcpy要求类似。

2.模拟实现:

指针法:

char *mystrcat(char *a1,char *a2)
{
    char *p=a1;
    while(*a1)
    {
        a1++;
    }
    while(*a2)
    {
        *a1=*a2;
        a1++;
        a2++;
    }
    *a1='\0';
    return p;
}
int main()
{
    char arr1[20] = "hello ";
    char arr2[] = "world";
    mystrcat(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

运行结果一样的。

六、strcmp函数

1.介绍

int strcmp ( const char * str1, const char * str2 );

功能:用来比较str1 和str2 指向的字符串,从两个字符串的第⼀个字符开始⽐较,如果两个字符的ASCII码值相等,就比较下⼀个字符。直到遇到不相等的两个字符,或者字符串结束。

str1 :指针,指向要⽐较的第⼀个字符串。

str2 :指针,指向要⽐较的第⼆个字符串。

返回值:strcmp 函数返回的两个字符串比较的值。

返回值规定:

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

2.第⼀个字符串等于第⼆个字符串,则返回0。

3.第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字。

代码示例:

int main()
{
    char arr1[] = "abcdef";
    char arr2[] = "abq";
    int ret = strcmp(arr1, arr2);
    printf("%d\n", ret);
    if(ret > 0)
        printf("arr1 > arr2\n");
    else if(ret == 0)
        printf("arr1 == arr2\n");
    else
        printf("arr1 < arr2\n");
    return 0;
}

对此代码解释:

strcmp比较大小为逐一比较,如果相等,则转向下一个字符。

2.strcmp函数的模拟实现:
指针法:

int mystrcmp(char *a,char *b)
{
    while(*a==*b)
    {
        if(*a=='\0')
        {
            return 0;
        }
        a++;
        b++;
    }
    return *a-*b;
}
int main()
{
    char arr1[] = "abcdef";
    char arr2[] = "abq";
    int ret = mystrcmp(arr1, arr2);
    printf("%d\n", ret);
    if(ret > 0)
        printf("arr1 > arr2\n");
    else if(ret == 0)
        printf("arr1 == arr2\n");
    else
        printf("arr1 < arr2\n");
    return 0;
}

对该方法介绍一下:

通过循环比较字符直到不同或遇到结束符 '\0',返回字符差值,这样的方式即可得到结果。


总结

以上就是今天要讲的内容,本文简单介绍了:

1. 字符分类函数
2. 字符转换函数
3. strlen的使用和模拟实现
4. strcpy的使用和模拟实现
5. strcat的使用和模拟实现
6. strcmp的使用和模拟实现

知识的相关内容,为本章节知识的内容,希望大家能喜欢我的文章,谢谢各位。

http://www.dtcms.com/a/365167.html

相关文章:

  • 《网络安全实战:CC攻击(应用层)与DDoS攻击(网络层)的底层逻辑与防御体系》​
  • 基于SpringBoot+Vue开发的环境保护监督管理网站
  • 如何通过控制台查看向量检索服务使用数据
  • Vue Router原理及SPA页面刷新解析
  • 融云:当我们谈论 AI 重构业务时,我们到底在谈论什么
  • SAM TTS网页官网入口 – 在线版微软tts在线语音合成助手
  • 【TRAE调教指南之MCP篇】FastMCP:快速制作自己的MCP服务
  • 对锁的总结
  • Agent 热潮遇冷?Manus 为何仍是 “版本神”
  • 充电枪结构设计-经验总结
  • 具身智能让人形机器人 “活” 起来:懂语言、能感知、会行动,智能进化再提速
  • docker安装rabbitmq(4.1.4-management)
  • 客户分层是什么?提升企业运营效率
  • 【python】运算符及语句
  • 数据结构:栈和队列(上)
  • 低代码革命遇瓶颈?这个“套娃神技“才是破局关键!
  • 【FastDDS】Layer DDS之Domain ( 05-Creating a DomainParticipant)
  • 关于linux网络编程——3
  • 扫地日记:有鹿巡扫机器人在景区被人类“调戏”的365天
  • ansible总结2
  • GIS大学课程表都长啥样?几个地信专业的大学一周课程表
  • 如何评价2025年数学建模国赛?
  • (二)文件管理-基础命令-pwd命令的使用
  • 高并发数据写入场景下 MySQL 的性能瓶颈与替代方案
  • “我店”积分模式的可持续性拷问:短剧能否撑起长期消泡沫需求?
  • 蓝桥杯算法之基础知识(6)
  • Python函数和方法类型注释
  • k8s使用StatefulSet(有状态)部署单节点 MySQL方案(使用本地存储)
  • 【Python】 Python 项目初始化脚本
  • JavaWeb03