C语言字符串相关函数

C语言笔记

内容提要

  • 数组

    • 字符串基本操作

    • 字符串相关函数

  • 综合案例:学生成绩管理系统

数组

字符串基本操作

在用格式化说明符%s进行输入输出时,其输入输出项均为数组名。但在输入时,相邻两个

字符串之间要用空格分隔,系统将自动在字符串后加\0 。在输出时,遇到结束符\0

为输出结束标志。

对于字符串的操作,我们需要使用到一些系统提供的API函数。

字符串输入
scanf
语法:
scanf("%s",数组名)

注意:采用scanf进行字符串输入,要求字符串中不能有空格,否则字符串遇到空格就结束

案例:

#include <stdio.h>int main(int argc,char *argv[]){// 创建一个char数组,用来存储姓名char name[20];printf("请输入您的名字:\n");scanf("%s", name); // 用字符数组接收一个控制台输入的字符串常量printf("您的姓名是%s\n", name);return 0;}

注意:采用scanf进行字符串输入,要求字符串中不能有空格,否则字符串遇到空格就会结束

fgest

语法:

fgets(数组名,数组容量,stdin);

功能

从键盘录入一个字符串常量到字符数组,返回字符数组的地址(首地址,默认返回的

地址,一般用12位16进制数表示)

说明:

采用fgets进行字符串输入,可获取所有输入的字符串,包含\n,在实际的字符串处理

时,我们可能需要手动处理\n

案例:

#include <stdio.h>int main(int argc,char *argv[]){// 创建一个字符数组,用来存储姓名char name[20]; // 只是创建数组,必须指定容量;如果初始化,可以省略容量。// 计算数组容量int len = sizeof(name) / sizeof(name[0]);printf("请输入您的姓名:\n");fgets(name, len, stdin);printf("您的姓名是%s\n", name);return 0;}

注意

①如果输入的字符串不包括空格和换行,可以用scanf。

②如果输入的字符串包括空格和换行,可以用fgest。

gets 危险的【C11移出】

语法:

gets(数组名);

功能:

从键盘录入一个字符串常量到字符数组,返回字符数组的地址(首地址,默认返回的

地址,一般用12位16进制数表示)

说明:

采用gets进行字符串输入,可获取所有输入的字符串,包含 \n ,在实际的字符串处

理时,我们可能需要处理 \n

案例:

#include <stdio.h>int main(int argc,char *argv[]){// 创建一个字符数组,用来存储姓名char name[20]; // 只是创建数组,必须指定容量;如果初始化,可以省略容量。// 计算数组容量int len = sizeof(name) / sizeof(name[0]);printf("请输入您的姓名:\n");gets(name);printf("您的姓名是%s\n", name);return 0;}
字符串输出
printf

语法

printf("%s",数组名);

案例:

#include <stdio.h>int main(int argc,char *argv[]){// 创建一个字符数组,用来存储姓名char name[20]; // 只是创建数组,必须指定容量;如果初始化,可以省略容量。// 计算数组容量int len = sizeof(name) / sizeof(name[0]);printf("请输入您的姓名:\n");fgets(name, len, stdin);printf("您的姓名是%s\n", name);.// %s支持字符串常量,也支持字符数组,都是以字符串形式输出return 0;}
fputs

语法:

fputs(数组名,stdout);

功能:输出一个字符串

说明:字符串可以包括转义字符(\开头的字符)

案例:

#include <stdio.h>int main(int argc,char *argv[]){char arr[] = "hi yifanjiao\neat!\n";// 第1种输出printf("%s", arr);// 第2种输出fputs(arr, stdout);return 0;}

puts 危险的【C11移出】

语法:

puts(数组名称);

功能:输出一个字符串

说明:字符串可以包含转义字符

案例:

#include <stdio.h>int main(int argc,char *argv[]){char arr[] = "hi yifanjiao\neat!\n";// 第1种输出printf("%s", arr);// 第2种输出puts(arr);return 0;}

字符串相关函数

字符串拼接

语法

strcat(字符数组,需要拼接的字符串或者字符数组或者字符指针);

解释

①这里的字符串,可以是字符串常量,也可以是字符数组或者字符指针,参数1必须是字符数组。

②这里需要将字符串2拼接到字符串1,所以需要字符串1有足够大的空间去容纳字符串2。

引入

#include <string.h>

案例

  • 需求:将两个字符串拼接为一个字符串

  • 分析:

  • 代码:

#include <stdio.h>// 使用字符串相关函数需要引入必要的头文件#include <string.h>int main(int argc,char *argv[]){// 创建一个字符数组,用来接收控制台输入char name[20];printf("请输入您的名字:\n");// 通过控制台输入字符串(支持空格)fgets(name, sizeof(name) / sizeof(name[0]), stdin);// 输出拼接 strcat返回拼接后的字符串fputs(strcat(name, "你好!"), stdout);printf("\n");// char str[50];// fputs(strcat(str, strcat(name, "你好!")), stdout);return 0;}

注意:

参数1 必须是字符数组,长度必须足够大,以便于能够容纳被链接的字符串。

② 连接后系统将自动取消参数1 后面的结束符 \0

参数2 可以是字符数组名,也可以是指针,也可以是字符串常量,如:strcat(s1,"def"); strcat(s1,s2);

字符串拷贝

语法

strcpy(数组名,字符串);

解释:简单来说,类似于将一个字符串赋值给一个字符数组。这个函数一般用来做赋值处理。

引入:

#include <string.h>

说明:这个函数适合给字符串赋值

char str[20] = "**培"; // 正确,字符数组的初始化,字符串初始化char str[20] = "**培"; str = "*佳"; // 错误,不能对数组进行赋值char str[20] = "**凡"; strcpy(str, "**林");// 正确,利用函数实现类似赋值的操作

注意: strcat和strcpy的区别:

  • strcat: 凡 + 鸿 → 鸿 (追加)

  • strcpy: 凡 + 鸿 → **鸿 (覆盖)

案例

#include <stdio.h>#include <string.h>int main(int argc,char *argv[]){// 需求:对数组赋值char name[50] = "hello";printf("打印初始化后的数组:%s\n", name);// 对一个数组赋:// name = "**鸿"; // 数组一旦创建,就无法改变,所以不能对数组进行赋值// 通过 strcpy(字符数组,字符数组/字符常量/字符指针)实现给数组赋值strcpy(name, "my");// my | mylloprintf("打印重新赋值后的数组:%s\n", name);return 0;}
字符串比较

语法

strcmp(字符串1,字符串2);

注意:这里的字符可以是字符串常量、字符数组、字符指针。

引入

#include <string.h>

功能:如果是英文,比较两个字符串对应位置字符ASCII的大小

返回值

  • 如果字符串1 等于 字符串2,返回0

  • 如果字符串1 大于 字符串2,返回正数(>0)

  • 如果字符串1 小于 字符串2,返回负数(<0)

说明

① 执行这个函数时,自左向右逐个比较对应字符的ASCII的值,直到发现了不同字符或字

符串结束符\0为止

② 对字符串不能用数值型比较符。比如:"abc" == "abc",这种比较是错误的。

③ 字符串1与字符串2可以是字符数组、字符指针、字符串常量。

案例

  • 需求:通过控制台输入用户名和密码,并进行校验

  • 代码:

#include <stdio.h>#include <string.h>int main(int argc,char *argv[]){// 用户登陆案例// 创建两个变量,用来存储用户名和密码char username[20], password[8];printf("---------用户登录--------\n");printf("请输入您的用户名:\n");scanf("%s",username);// 数组名本身就是一个地址(首元素的首地址)printf("请输入您的密码:\n");scanf("%s",password);// 校验if (!strcmp(username,"admin") && !strcmp(password,"123456"))// 相等:strcmp(..) == 0printf("登录成功!\n");elseprintf("用户名或者密码错误!\n");return 0;}
字符串长度

语法

strlen(字符串);

引用:

#include <string.h>

注意:返回字符串中包括的字符的实际个数。遇到\0结束,不包括\0,如果数组中不存在\0就以数组的实际长度作为字符串长度

案例

  • 需求:字符串长度案例

  • 代码:

#include <stdio.h>#include <string.h>int main(int argc,char *argv[]){// 测试数据1char s1[] = {'h','i','\0','h','i','\0'};printf("数组长度:%lu\n字符串长度:%lu\n",sizeof(s1)/sizeof(s1[0]), strlen(s1));// 数组长度:6,字符串长度:2// 测试数据2char s2[] = "hi\0hi\0";// 使用双引号包裹的内容称之为 字符串常量,字符串常量默认会有一个结尾的\0printf("数组长度:%lu\n字符串长度:%lu\n",sizeof(s2)/sizeof(s2[0]), strlen(s2));// 数组长度:7,字符串长度:2// 测试数据3char s3[] = {'h','e','l','l','o'};// strlen()判断一个字符串的长度,优先判断是否存在\0,如果不存在,就返回数组实际长度,因编译器原因,处理机制也有所不同。printf("数组长度:%lu\n字符串长度:%lu\n",sizeof(s3)/sizeof(s3[0]), strlen(s3));// 数组长度:5,字符串长度: 5,这种写法不安全,不同编译器编译结果不同// 测试数据4char s4[] = "hello";printf("数组长度:%lu\n字符串长度:%lu\n",sizeof(s4)/sizeof(s4[0]), strlen(s4));// 数组长度:6,字符串长度:5return 0;}

案例

  • 需求:输入一行字符,统计其中有多少个单词,单词之间使用空格隔开。举例:ILOVE YOU

分析:采用通过空格统计单词的方法。具体是:

① 用连续若干个空格算一个、一行开头的空格不计的方法决定单词数目;

② 从第一个字符开始逐个检查字符串中的每一个字符。若查到某一字符非空格,而其前面的字符是空格,则表示新单词开始,让计数变量num++。否则,当前字符非空格,前面字符也非空格,则非新单词,num不变;

③ 用变量word=0或1来表示前面字符是空格或不是空格。则:

  • 代码:

#include <stdio.h>#include <ctype.h>int main(int argc,char *argv[]){// 创建一个数组,用来接收控制台录入的字符串char string[100];// 创建2个变量,word:统计字符是否是空字符(空字符:0,非空字符:1),num:用来统计单词个数int num = 0, word = 0;// 创建一个变量,用来存储遍历到的字符char c;// 通过控制台录入字符串printf("请输入一句话:\n");fgets(string, sizeof(string)/sizeof(string[0]), stdin);// 遍历for (int i = 0; (c = string[i])!='\0'; i++){if (isspace(c)) // 判断一个字符是否是空格,等价于 if (c == ''){// 如果是空格,标记word = 0;}else{// 如果上一个字符是空格,就需要统计单词if (!word) // 等价于 word == 0{// 标记word为非空格word = 1;// 统计单词个数num ++;}}}printf("%s\n中有%d个单词!\n", string, num);return 0;}

案例

有三个字符串,要求找出其中最大者。

分析:设计一个二维字符数组str3,即3行20列。

① 可把str[0]、str[1]、str[2]看作3个一维字符数组,各有20个元素;

② 用gets函数分别输入3个字符串到str[0]、str[1]、str[2]中 ;

③ 用字符串函数对str[0]、str[1]、str[2]进行比较,得到最大者。

#include <stdio.h>#include <string.h>int main(int argc,char *argv[]){// 创建一个数组,用来存储最大的字符串char max[50];// 创建一个数组,用来存储3个用来参与比较的字符串char str[3][50]/* = {"apple","orange","egg"}*/;int i;// 通过循环控制台输入printf("请输入3个测试字符串:\n");for (i = 0; i < 3; i++){fgets(str[i],50,stdin);}// 比较if (strcmp(str[0],str[1]) > 0) strcpy(max, str[0]);else strcpy(max,str[1]);if (strcmp(str[2],max) > 0) strcpy(max,str[2]);printf("\n三个字符串中最大的字符串是%s\n!", max);return 0;}

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

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

相关文章

从零开始:用Python库轻松搭建智能AI代理

为什么要关注AI代理&#xff1f; “Agentic AI”&#xff08;智能代理&#xff09;正在悄然改变我们的工作方式。想象一下&#xff0c;一个AI助手不仅能帮你查航班、订机票&#xff0c;还能自动安排行程、发邮件、生成日报——就像一个效率极高的“虚拟助理”团队。 对于测试工…

如何防止GitHub上的敏感信息被泄漏?

如大家所了解的&#xff0c;随着GitHub的用户越来越多&#xff0c;GitHub上的敏感信息被泄漏的问题也越来越严重。那么如何做&#xff0c;才能防止此类事情发生呢&#xff1f;这值得我们探讨。移除并删除敏感信息当我们发现了历史 commit 中包含敏感信息后&#xff0c;第一步便…

船舶机械零件的深孔工艺及检测方法 —— 激光频率梳 3D 轮廓检测

引言船舶机械零件中的深孔结构&#xff08;深径比&#xff1e;15:1&#xff09;直接影响动力系统可靠性&#xff0c;如柴油机缸体深孔、推进轴系润滑油孔等。此类深孔具有孔径大&#xff08;φ10 - 50mm&#xff09;、深度深&#xff08;500 - 2000mm&#xff09;、表面质量要求…

论文Review Lidar 3DGS Splat-LOAM: Gaussian Splatting LiDAR Odometry and Mapping

基本信息 题目&#xff1a;Splat-LOAM: Gaussian Splatting LiDAR Odometry and Mapping 来源&#xff1a;ICCV 2025 学校&#xff1a;Sapienza University of Rome 是否开源&#xff1a;https://github.com/rvp-group/Splat-LOAM 摘要&#xff1a;纯激光3DGS&#xff01;…

MYSQL:数据库约束

文章目录MYSQL&#xff1a;数据库约束&#xff1a;为你的数据上把“安全锁”1. 约束的类型概览2. NOT NULL 非空约束3. DEFAULT 默认值约束4. UNIQUE 唯一约束5. PRIMARY KEY 主键约束5.1 自增主键 AUTO_INCREMENT5.3 复合主键6. FOREIGN KEY 外键约束7. CHECK 约束总结MYSQL&a…

网络数据编码技术及其应用场景的全面解析

网络数据编码技术全景图​编码类型​​编码原理​​适用层​​典型应用场景​​优势​​缺陷​​曼彻斯特编码​电平跳变代表数据位&#xff08;高→低1&#xff0c;低→高0&#xff09;物理层10/100M以太网、RFID标签自同步时钟带宽利用率仅50%​4B/5B编码​4比特映射为5比特物…

RustDesk自建服务器完整部署指南:从零开始到成功连接。成功解决rustdesk报错:未就绪,请检查网络连接

最近需要用到远程工具解决用户问题&#xff0c;todesk总是提示付费&#xff0c;干脆自己使用开源的。当然凡事都有代价。 话费了一个工作日的时间终于搞定了。 本文将详细介绍如何从零开始部署RustDesk自建服务器&#xff0c;实现完全自主可控的远程桌面解决方案。 踩坑 参考…

datasophon安装doris问题排除记录

datasophon安装doris搞了好久才成功&#xff0c;特别记录一下。 多灾多难的安装过程&#xff1a;FE安装 首先&#xff0c;配置界面&#xff0c;要注意两个参数一定要改成正确的网段&#xff0c;否则会被识别成127.0.0.1注意&#xff1a;两个priority_networks 参数必须要改成你…

suricata新增Mysql告警规则处理

suricata新增Mysql告警规则处理协议解析后续处理内容新增规则规则解析关键字新增Setup用于初始化检测项Free用于资源释放AppLayerTxMatch用于协议解析完成后的规则检测针对pcap文件进行检测总结协议解析后续处理内容 经过Mysql协议解析处理流程 介绍&#xff0c;我们在suricat…

使用位运算优化 Vue.js 应用:高效状态管理技巧

在 Vue.js 开发中&#xff0c;位运算&#xff08;Bitwise Operations&#xff09;是一种高效的工具&#xff0c;尤其适用于需要管理大量布尔状态或优化性能的场景。位运算通过操作二进制位来实现状态的存储和检查&#xff0c;相比传统的数组或对象操作&#xff0c;内存占用更低…

【Java SE】Clonable接口和深拷贝

目录 一.Clonable接口 实现步骤&#xff1a; 完整代码&#xff1a; 二.深拷贝 实现步骤&#xff1a; 完整代码&#xff1a; 浅拷贝与深拷贝的对比 使用场景建议 完 浅拷贝&#xff08;Shallow Copy&#xff09;和深拷贝&#xff08;Deep Copy&#xff09;是对象复制的两…

accelerate 在Pycham中执行的设置方法

背景 使用 accelerate 进行分布式代码训练时&#xff0c;需要在pycharm中进行调试&#xff0c;此时需要在pycharm中运行。 终端执行命令 # *[Specify the config file path and the GPU devices to use] export CUDA_VISIBLE_DEVICES0# *[Specify the config file path] expo…

探索量子计算与法律理论的交叉领域

文章目录 前言 一、引言 二、内容 (一)知识产权 (二)隐私与安全 (三)责任认定 (四)证据与证明 (五)法律推理与决策 三、结论 总结 前言 随着量子计算技术的突破性发展,其引发的法律范式重构问题日益凸显。乌兹别克斯坦学者伊索姆别克・阿卜迪哈基莫夫于2024年在《量…

js迭代器

文章目录前言实现原理&#xff1a;调用迭代器自制迭代器前言 迭代器是 JSt 中一种特殊的对象&#xff0c;它提供了一种统一的、通用的方式遍历个各种不同类型的数据结构。 可以遍历的数据结构包括&#xff1a;数组、字符串、Set、Map 等可迭代对象。我们也可以自定义实现迭代器…

chainlink VRF中文教程(含mock),解决error: Arithmetic Underflow in createSubscription

⸻我使用的版本&#xff1a;chainlink-brownie-contracts version:1.3.0⸻1. Import 相关包 ,,, import {VRFConsumerBaseV2Plus} from "chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2PLUS.sol"; import {VRFV2PlusClient} from "chainlink/contract…

非线性优化框架CasADi工具箱求解最优控制问题OCP

CasADi是一个开源的Python/MATLAB库&#xff0c;主要用于数值优化&#xff0c;特别是最优控制问题。它提供了一个易于使用的符号框架&#xff0c;用于处理和生成表达式&#xff0c;以及高效地生成导数信息。 https://web.casadi.org/get/https://web.casadi.org/get/ 所有OCP…

Type-C接口台式显示器:LDR6021引领新潮流

Type-C单口便携显示器LDR6021是市场上一种新兴的显示设备&#xff0c;以下是对其的详细介绍一、主要特点 便携性:LDR6021采用了Type-C接口作为数据传输和供电接口&#xff0c;这种设计使得它能够与各种支持Type-C接口的设备无缝连接&#xff0c;如笔记本电脑、智能手机、平板电…

在翻译语义相似度和会议摘要相似度评估任务中 ,分类任务 回归任务 生成任务区别

在翻译语义相似度&#xff08;Translation Semantic Similarity&#xff09;和会议摘要相似度&#xff08;Meeting Summary Similarity&#xff09;等任务中&#xff0c;通常会根据任务的目标和输出形式&#xff0c;将其划分为三类常见的任务类型&#xff1a;1. 分类任务定义&a…

UGUI 性能优化系列:第二篇——Canvas 与 UI 元素管理

UGUI 性能优化系列&#xff1a;第一篇——基础优化与资源管理 UGUI 性能优化系列&#xff1a;第二篇——Canvas 与 UI 元素管理 UGUI 性能优化系列&#xff1a;第三篇——渲染与像素填充率优化 UGUI 性能优化系列&#xff1a;第四篇——高级优化与注意事项 在 UGUI 性能优化…

企业开发转型 | 前端AI化数字化自动化现状

文章目录前端AI化数字化自动化发展现状引言调研背景与目的调研范围与方法前端AI化技术现状与工具生态主流AI工具分类与能力矩阵工具能力对比分析关键能力指标深度解析大模型技术成熟度评估前端AI化核心应用场景与人力优化路径代码生成与自动化开发设计到代码全链路自动化自动化…