C语言——字符函数和字符串函数_学习笔记

news2025/7/6 13:31:42

本文目录

  • 一、字符函数
    • 1.1 字符分类函数
      • 常见的字符分类函数介绍
      • 应用举例
    • 1.2 字符转换函数
      • 函数介绍
      • toupper 函数举例
  • 二、字符串函数
    • 2.1 常用的字符串函数介绍
    • 2.2 应用举例
      • ① strlen
      • ② strcpy
      • ③ strcat
      • ④ strcmp
      • ⑤ strncpy
      • ⑥ strncat
      • ⑦ strncmp
      • ⑧ strstr
      • ⑨ strtok

关于一些字符串函数的模拟实现,欢迎浏览文章C语言——一些字符串函数的模拟实现

一、字符函数

1.1 字符分类函数

C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。这些函数的使用都需要包含一个头文件是<ctype.h>

常见的字符分类函数介绍

函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘\f,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit十进制数字0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母a~ f,大写字母A~ F
islower小写字母a~z
isupper大写字母A~Z
isalpha字母a~ z和字母A~ Z
isalnum字母或者数字,a~ z, A~ Z,0~9
ispunct标点符号,任何可打印的,不属于数字或字母的图形字符
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

应用举例

这些函数的使用方法非常类似,我们用 iscntrl 举例,其他的非常类似:

#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="first line \n second line \n";
  while (!iscntrl(str[i]))
  {
    putchar (str[i]);
    i++;
  }
  return 0;
}
  1. 在C语言中,一个"!“符号表示逻辑非操作。当它后面跟着一个布尔表达式时,它将其取反。例如,如果表达式的结果为true,则”!"操作符将其转换为false,反之亦然。
  2. iscntrl 函数遇到任何控制字符的结果返回为真。(\n是一个控制字符)

上面代码的意思是,遍历输出字符串数组str[],遇到控制字符停止输出
输出结果为:

first line 

1.2 字符转换函数

函数介绍

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

函数名函数作用
tolower将传入参数中的小写字母转为大写字母
toupper将传入参数中的大写字母转为小写字母

如果不使用库函数,我们将小写字母转大写字母,是小写字母进行-32得到的结果;大写转小写就是+32的结果。但是有了库函数,就可以直接使用库函数,方便快捷高效。

toupper 函数举例

void toUpperCase(char* str) 
{
    for (int i = 0; str[i] != '\0'; i++) 
    {
        str[i] = toupper(str[i]);
    }
}

int main() 
{
    char str[] = "Hello, world!";
    printf("原字符: %s\n", str);
    toUpperCase(str);
    printf("转换后: %s\n", str);
    return 0;
}

输出结果如下:
在这里插入图片描述

二、字符串函数

使用字符串函数要注意包含<string.h>头文件

关于一些字符串函数的模拟实现,欢迎浏览文章C语言——一些字符串函数的模拟实现

2.1 常用的字符串函数介绍

函数函数作用
strlen(a)用于计算字符串a的长度的函数,返回值为size_t类型的数字,头文件<string.h>
strcpy(a,b)用于复制源字符串b, 到目标字符串a, 连 \0 字符一起拷贝,返回值为字符串a首元素的地址,头文件<string.h>
strcat(a,b)将源字符串 b 的内容连接到目标字符串 a 的末尾,并在结果字符串的末尾添加结束符\0。返回值为字符串a首元素的地址,头文件<string.h>
strcmp(a,b)比较a和b两个字符串,如果两个字符串完全相同,函数返回0;如果第一个参数str1中的字符串在字典顺序上位于第二个参数str2中的字符串之前,函数返回一个负整数。如果str1中的字符串在字典顺序上位于str2中的字符串之后,函数返回一个正整数。
strncpy(str1,str2,n)用于复制源字符串str2的前n个字符到目标字符串str1中,返回值为字符串str1首元素的地址。头文件<string.h>
strncat(str1,str2,n)用于将源字符串str2的前n个字符追加到目标字符串str1的末尾,返回值为字符串str1首元素的地址。头文件<string.h>
strncmp(str1,str2,n)函数按照字典顺序逐个比较两个字符串的前n个字符,直到遇到不匹配的字符或到达字符串的末尾。如果两个字符串的前n个字符完全相同,函数返回0。如果第一个参数str1中的字符串在前n个字符的字典顺序上位于第二个参数str2中的字符串之前,函数返回一个负整数。如果str1中的字符串在前n个字符的字典顺序上位于str2中的字符串之后,函数返回一个正整数。头文件<string.h>
strstr(str1,str2)是在str1字符串中查找str2字符串的第一次出现。这个函数返回的是指向str1中第一次出现str2的位置的指针。如果str2没有在str1中出现过,那么函数将返回NULL。头文件<string.h>
strtok(str,delim)用于将一个字符串分割成一系列子字符串。函数会将str按照delim中的字符进行分割,并返回指向第一个子字符串的指针。每次调用strtok函数都会将指针移动到下一个子字符串,直到没有更多的子字符串为止。(在分割字符串时,strtok函数会忽略掉字符串中的前导和尾随空格。如果分隔符字符串为NULL,则默认使用空格作为分隔符。)头文件<string.h>

2.2 应用举例

① strlen

函数原型如下:

#include <string.h>

size_t strlen(const char *str);
  1. 这个函数接受一个指向字符串的指针作为参数,并返回该字符串的长度,不包括字符串末尾的空字符(‘\0’)。

  2. strlen函数使用指针来遍历字符串中的每个字符,直到遇到空字符为止,它计算遍历过的字符数并返回结果。

以下是一个使用strlen函数的示例:

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

int main() {
    char str[] = "Hello, world!";
    printf("Length of string: %zu\n", strlen(str));
    return 0;
}

在这个示例中,strlen函数计算字符串str的长度并使用printf函数输出结果。注意,我们使用了%zu格式说明符来输出strlen函数的返回值,因为它的返回类型是size_t。

输出结果为:

在这里插入图片描述

② strcpy

函数原型如下:

#include <string.h>

char *strcpy(char *dest, const char *src);
  1. dest是目标字符串的指针,src是源字符串的指针。

  2. strcpy函数将源字符串复制到目标字符串中,包括终止符\0。它返回指向目标字符串的指针。

以下是一个使用strcpy函数的示例:

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

int main() {
    char src[30] = "Hello, world!";
    char dest[30];

    strcpy(dest, src);
    printf("Source string: %s\n", src);
    printf("Destination string: %s\n", dest);

    return 0;
}

在这个示例中,strcpy函数将src中的字符串复制到dest中,然后通过printf函数输出两个字符串。

输出结果如下:
在这里插入图片描述

③ strcat

函数原型如下:

#include <string.h>

char *strcat(char *dest, const char *src);
  1. 其中,dest是目标字符串的指针,src是要连接的源字符串的指针。

  2. strcat函数将源字符串追加到目标字符串的末尾,并在结果字符串的末尾添加一个终止符\0。它返回指向目标字符串的指针。

以下是一个使用strcat函数的示例:

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

int main() {
    char dest[30] = "Hello, ";
    char src[30] = "world!";

    strcat(dest, src);
    printf("Result string: %s\n", dest);

    return 0;
}

在这个示例中,strcat函数将src中的字符串追加到dest的末尾,然后通过printf函数输出结果字符串。

输出结果如下:
在这里插入图片描述

④ strcmp

函数原型如下:

#include <string.h>

int strcmp(const char *str1, const char *str2);
  1. 其中,str1和str2是两个要进行比较的字符串的指针。

  2. strcmp函数按字典顺序比较两个字符串,并返回它们的差值。如果两个字符串完全相同,则返回0;如果第一个字符串比第二个字符串小,则返回一个负数;如果第一个字符串比第二个字符串大,则返回一个正数。

以下是一个使用strcmp函数的示例:

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

int main() {
    char str1[] = "Hello";
    char str2[] = "hello";
    int result = strcmp(str1, str2);

    if (result == 0) {
        printf("Strings are equal.\n");
    } else if (result < 0) {
        printf("String 1 is less than string 2.\n");
    } else {
        printf("String 1 is greater than string 2.\n");
    }

    return 0;
}

在这个示例中,strcmp函数比较了str1和str2两个字符串,并根据比较结果输出相应的消息。

输出结果为:

在这里插入图片描述

⑤ strncpy

strncpy函数的原型:

char *strncpy(char *dest, const char *src, size_t n);

下面是一个使用strncpy函数的示例:

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

int main() {
    char dest[10] = "Hello";
    const char src[] = " World";
    strncpy(dest, src, 5);
    printf("%s\n", dest);  // 输出:Hello W
    return 0;
}

在这个示例中,我们有一个目标字符串"Hello"和一个源字符串" World"。我们使用strncpy函数将源字符串的前5个字符复制到目标字符串中,结果是"Hello W"。注意,因为目标数组只有10个空间,所以我们只复制了前5个字符,而不是整个源字符串。同时,因为我们没有为目标数组预留空间来添加空字符,所以最后的输出并没有自动添加空字符。

⑥ strncat

该函数的原型定义:

char *strncat(char *dest, const char *src, size_t n);

下面是一个使用strncat函数的示例:

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

int main() {
    char dest[10] = "Hello";
    const char src[] = " World";
    strncat(dest, src, 4);
    printf("%s\n", dest);  // 输出:Hello World
    return 0;
}

在这个示例中,我们有一个目标字符串"Hello"和一个源字符串" World"。我们使用strncat函数将源字符串的前4个字符追加到目标字符串的末尾,结果是"Hello World"。

⑦ strncmp

strncmp函数的原型定义:

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

下面是一个使用strncmp函数的示例:

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

int main() {
    const char str1[] = "Hello";
    const char str2[] = "Hell";
    int result = strncmp(str1, str2, 4);
    if (result < 0) {
        printf("%s is less than %s\n", str1, str2);
    } else if (result > 0) {
        printf("%s is greater than %s\n", str1, str2);
    } else {
        printf("%s is equal to %s\n", str1, str2);
    }
    return 0;
}

输出结果为:

在这里插入图片描述

⑧ strstr

strstr函数的原型是:

const char *strstr(const char *haystack, const char *needle);

以下是一个使用strstr函数的例子:

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

int main() {
    const char *haystack = "Hello, world!";
    const char *needle = "world";
    const char *result = strstr(haystack, needle);

    if (result) {
        printf("'%s' found in '%s' at position: %ld\n", needle, haystack, result - haystack);
    } else {
        printf("'%s' not found in '%s'\n", needle, haystack);
    }

    return 0;
}

这段代码会输出:“‘world’ found in ‘Hello, world!’ at position: 7”,因为“world”在“Hello, world!”中第一次出现的位置是从字符串的第七个字符开始的。

⑨ strtok

strtok函数的原型是:

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

以下是一个使用strtok函数的例子:

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

int main() {
    char str[] = "Hello, World! How are you?";
    const char delim[] = " ,!";
    char *token;

    token = strtok(str, delim);
    while (token != NULL) {
        printf("%s\n", token);
        token = strtok(NULL, delim);
    }

    return 0;
}

这段代码会将字符串"Hello, World! How are you?"分割成多个子字符串,并输出每个子字符串。输出的结果将是:

Hello
World
How
are
you?

关于一些字符串函数的模拟实现,欢迎浏览文章C语言——一些字符串函数的模拟实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1007442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【新版vscode配置自动补全括号】

vscode新版配置自动补全括号方法 新版配置方法(Pylance) ①设置 -> 扩展 -> Pylance -> 将 python.analysis.completeFunctionParens 下方的选项打勾 ②直接在settings.json中添加"python.analysis.completeFunctionParens": true

书单背景图和视频制作方法分享

如今&#xff0c;在社交媒体上发布一张书单背景图或宣传视频已成为推广阅读和书籍的流行方式。这些视觉内容能够吸引读者的眼球并提供一些简单易懂的信息&#xff0c;如书名、作者、简介等。下面是一些简单的方法&#xff0c;可以帮助你创建出与众不同的书单背景图和视频。 创意…

kubernetes安全检测工具-kube-bench

一、kube-bench基础介绍 kube-bench是基于go语言开发、一款针对kubernetes进行安全检测的工具&#xff0c;主要是检测kubernetes集群的各个组件的配置&#xff0c;确认配置文件是否符合安全基线标准&#xff0c;输出检测报告&#xff0c;并给出修复建议&#xff0c;从而使kuber…

Jetson nano嵌入式平台配置ip记录

背景 Jetson nano平台使用千兆网和PC连接时没有ip地址&#xff0c;在ubuntu的终端输入ifconfig显示eh0未设置ip&#xff0c;需要先在nano平台上配置ip地址&#xff0c;然后PC通过千兆网远程控制该平台。 配置ip 使用终端进入到network文件夹中&#xff0c; cd /etc/network…

C++之list

目录 一、关于list 二、list相关函数 三、相关函数的使用 1、构造函数 2、push_back 3、迭代器 4、push_front 5、pop_back 6、insert 7、erase 关于迭代器失效问题 8、splice 9、remove 10、sort 一、关于list list和string、vector一样&#xff0c;都是容器&am…

领域驱动设计:微服务的各种边界

文章目录 演进式架构微服务还是小单体&#xff1f;微服务边界的作用 在用 DDD 进行微服务设计时&#xff0c;我们可以通过事件风暴来确定领域模型边界&#xff0c;划定微服务边界&#xff0c;定义业务和系统运行边界&#xff0c;从而保证微服务的单一职责和随需而变的架构演进能…

【Python】简记操作:Centos安装Python3虚拟环境-virtualenvwrapper

安装 pip3 install virtualenvwrapper 安装时报错&#xff1a;ERROR: Can not execute setup.py since setuptools is not available in the build environment. 原因&#xff1a; setuptools版本过低&#xff1b; 解决&#xff1a;升级setuptools # 升级setuptools版本 pi…

创邻科技,位居IDC MarketScape中国图数据库市场领导者类别

图数据库&#xff0c;正进入市场发展的新阶段。 随着中国经济社会数字化转型加速&#xff0c;数据成为新型生产要素。如何存储并管理海量数据&#xff0c;挖掘数据价值&#xff0c;打破原有增长天花板&#xff0c;成为企业重塑商业价值的关键。存量经济时代更需要深层关系挖掘&…

【深度学习】- NLP系列文章之一文本表示

系列文章目录 文本分类与词嵌入表示RNN、LSTM、GRU三种方式处理文本分类问题评论情绪分类 还是得开个坑&#xff0c;最近搞论文&#xff0c;使用lstm做的ssd的cache prefetching&#xff0c;意味着我不能再划水了。 文章目录 系列文章目录1. 文本数据表示法与词嵌入1.1 文本是…

蓝牙技术|8月公共充电桩环比增加6.1万台,蓝牙充电桩持续增长

中国充电联盟发布 2023 年 8 月全国电动汽车充换电基础设施运行情况。公共充电基础设施运行情况&#xff1a;2023 年 8 月比 7 月公共充电桩增加 6.1 万台&#xff0c;8 月同比增长 39.9%。截至 2023 年 8 月&#xff0c;联盟内成员单位总计上报公共充电桩 227.2 万台&#xff…

23062C++QTday5

将之前定义的栈类和队列类都实现成模板类 栈&#xff1a; #include <iostream> #define MAX 128using namespace std;template<typename T,typename C> class Stack { private:T top; //栈顶元素的下标C *data; //指向堆区空间public:Sta…

【案例教学】华为云API对话机器人的魅力—体验AI垃圾分类机器人

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;人工智能AI自言语言的情感分析、文本分词、文本翻译 1 IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts IDE&a…

Sudowrite:基于人工智能的AI写作文章生成工具

【 产品介绍】 名称 Sudowrite 成立/上线时间 2023年 具体描述 Sudowrite是一个基于GPT-3的人工智能写作工具&#xff0c;可以帮助你快速生成高质量的文本内容&#xff0c; 无论是小说、博客、营销文案还是学术论文。 Sudowrite可以根据你的输入和指…

BUSMASTER使用记录(一):基本收发、报文过滤、报文录制和数据回放

目录 一、概述二、基本收发2.1 连接设备2.2 接收2.3 发送 三、DBC加载和转换DBF文件四、报文过滤4.1 新增过滤器4.2 使能 五、报文录制/回放报文录制数据回放 一、概述 以往使用过的CAN盒虽然厂家不一样&#xff0c;但都兼容周立功的CANPro。这次使用的BusMaster&#xff0c;需…

ARM架构--栈

栈的概念 栈的本质就是一段内存&#xff0c;程序运行时用于保存一些临时数据 如局部变量、函数的参数、返回值、以及程序跳转时需要保护的寄存器等 在高级语言里面&#xff0c;操作的是变量。在ARM汇编里面&#xff0c;操作的是寄存器&#xff08;register&#xff09;、内存和…

LabVIEW对Table中同一行数据分多次增加

LabVIEW对Table中同一行数据分多次增加 在对多个设备采集数据&#xff0c;同时需要记录到表格中。很多时候多台数据并不是同时更新&#xff0c;比如有的是在开关之前读取更新&#xff0c;有的则是在开关闭合后更新。只是用Number Indicator的方式&#xff0c;需要很多个&#…

基于SSM的旅游网站系统

基于SSM的旅游网站系统【附源码文档】、前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;管理员、用户 管理员&#xff1a;用户管理、景点…

品牌 vs 营销:谁才是真正的推动商业增长的关键?

道叔曾经待过的公司&#xff0c;营销部和品牌部经常打架&#xff0c;明争暗斗&#xff0c;互相推诿&#xff0c;谁看谁不顺眼&#xff0c;沟通成本巨大....... 这两个本身关联密切、相辅相成的兄弟部门为什么会这样&#xff1f; 归根结底主要有以下三个原因&#xff1a; 1、…

【Linux系统编程】文件描述符与重定向

#include <unistd.h>int dup(int oldfd);int dup2(int oldfd, int newfd);dup函数是让最低位没有被使用的文件描述符也指向oldfd这个文件描述符所指向的文件&#xff0c;成功返回最低那个没有被使用的文件描述符&#xff0c;失败返回-1。 dup2函数是让newfd这个文件描述符…

IP代理安全吗?如何防止IP被限制访问?

你是否遇到过可以正常上网&#xff0c;但访问某个网站却被禁止&#xff1f;注册某个网站账号&#xff0c;却被封号&#xff1f;那都是因为IP出现问题&#xff01;您的IP地址透露很多关于您的信息&#xff0c;包括您的位置和互联网活动。 在本文中&#xff0c;我们将一起了解IP地…