当前位置: 首页 > 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.xdnf.cn/news/1442197.html

相关文章:

  • TypeScript 与 Java 重载机制对比
  • 08、Linux 安全组开放端口
  • 数据结构:图的表示 (Representation of Graphs)
  • C++完美转发
  • 微信小程序-day3
  • Uniapp中进行微信小程序头像和昵称的更改
  • 20250901 搜索总结
  • 免费专业软件推荐 | 图片/PDF水印添加神器:艾克斯水印工具使用全攻略
  • java中二维数组笔记
  • Git或TortoiseGit的小BUG(可解决):空库报错Could not get hash of ““
  • Nginx中的内置变量、指令、URL重写功能及其虚拟主机配置、负载均衡配置
  • 关于linux编程——网络编程2
  • 工业4.0时代的通信革命:OPC UA Pub/Sub机制全面解析
  • 百万级并发下的微服务架构设计之道:从阿里双11看分布式系统核心原则与落地实践
  • 云计算培训为什么这么贵?
  • EagleTrader观察|你的固定心态,可能正在悄悄让你交易破产
  • Element UI MessageBox 渲染虚拟节点的坑与解决方案
  • 【深度学习新浪潮】用3DGS做三维重建有哪些主要的技术路线可供选择?
  • 【随手记】vscode中C语言满足KR风格的方法
  • Leetcode—695. 岛屿的最大面积【中等】
  • Docker实战指南:从安装到架构解析
  • 【Linux】网络(中)
  • 数据结构:栈和队列(上)
  • 数据结构从青铜到王者第十九话---Map和Set(2)
  • 下载必要软件
  • Qt读写Excel--QXlsx基本使用
  • 基于-轻量级文档搜索系统的测试报告
  • 【GM3568JHF】FPGA+ARM异构开发板 使用指南:WIFI
  • SQLite3 操作指南:SQL 语句与 ORM 方法对比解析​
  • 存算一体:重构AI计算的革命性技术(1)