基于c语言的union、字符串、格式化输入输出

结构体之共用体union

共用体也叫联合体,其关键词为union

与结构体不同的是,共用体所开辟的存储空间仅仅为其中最长类型变量的存储空间而不是全部变量的存储空间,由于同一内存单元在同一时间内只能存放其中一种的数据类型,因此在每一瞬间起作用的成员就是最后一次被赋值的成员,正因为如此,所以共用体不能同时对所有成员初始化,只能对第一个成员进行初始化,除此之外,共用体不能进行比较操作,也不能够作为函数参数。

在结构体与共用体二者之间的套用之中,经过我个人的写题经验发现,在共用体之中不能够使用string变量,不知道是什么原因,一旦定义string变量于其中,就会发现编译出错

共用体常被用来分支情况的描绘

例题链接

教师 or 学生

解题思路

|----|----|----|----|
| 姓名 | 性别 | 职业 ||
| 姓名 | 性别 | 班级 | 职称 |

本题的解题思想就是因为在职业方面进行选择之后会有两个分支

一是班级分支二是职称分支,因班级与职称为二选一的关系,可以在结构体数组里面套用共用体实现

字符串

有时对于字符串的操作会让我们很头疼

在c的学习当中,我们在用字符型数组时,面对一维的输入输出问题尚且不大

但是面对二维的字符型数组的输入输出就会十分头疼

我们会难以判断什么时候该用getchar();来吸收空格消除影响什么时候不该用

这是c++中的一个类型字符串string就简便了许多

c++STL库中的函数也为相应的字符串的操作提供了巨大的便利

头文件#include <string>或者#include <string.h>或者#include <cstring>均可

现在我们来介绍几个写竞赛题时常用的以及我们在完成学校oj平台是巨好用的函数

1.substr

在对于获得单词的操作时,我们有许多种方法,可以使用手打判断的空串叠加(更为保险),也可以直接使用substr函数进行操作,例如当我们对一个字符串进行双指针操作之后,头指针指向某一单词前的空格,尾指针指向了那个单词的末尾后的空格,我们就可以定义一个空串,结构substr截取的字符串(即为那个单词)

string t = substr(i+1,j-i+1);

即截取完毕,而后我们就可以创立一个字符串数组对于存储的单词们进行下一步操作

常用的substr函数还有删除功能

例如你究竟有几个HMM (25 分)之中对于好妹妹(hmm)进行删除的操作

当然对于所要删除的flag标志出现在字符串末尾时,我们可以用substr直接截取

很显然name.size()=11,flag.size()=3,得知name.size()-flag.size()是等于8的

所以截取结果从0开始的8位字符为zhuyijin,此类功能为截取操作

当参数只有一个时,为截除前n个字符的操作

截除name的flag位数,name更新为zhuyijin

总结:

当substr仅仅有两个参数时a.substr(起始下标,终止下标);

可使用substr截取a串中的起始下标至终止下标之间的元素

当substr仅有一个参数时a.substr(n);

可使用substr删除a串中的前n个字符

2.insert

insert又称为插入操作

设字符串s1,s2;

若有两个参数a.insert(所插入下标idx,s2);

即为在s1串下标idx的元素后面插入s2串

若有四个参数a.insert(idx,s2,i,j);

即为在s1串下标为idx的元素后面插入s2串的下标从i到j的所有元素

3.字符串的追加操作

string类型相比于字符数组来说非常方便,不必使用strcat追加,仅仅使用字符串相加就可以

设字符串s1,s2,在s1串后追加s2,使用s1=s1+s2;即可

3.erase

设有字符串s

s.erase(i,j);删除s串当中从下标i至j的所有元素

4.replace

设有字符串s1,s2

s1.replace(m,n,s2,i,j);

在s1串m-n位置替换为s2串的i-j位置的元素

5.find

查找元素,可以查找单个字符或者字符串

设有字符串s1,s2和字符c

s1.find(s2);即为在s1串中寻找s2串第一次出现的位置,需要用一个整型变量接收

s1.find(c);即为在s1串中寻找字符c第一次出现的位置,需要用一个整型变量接收

s1.rfind(s2);即为在s1串中寻找s2串最后一次出现的位置,需要用一个整型变量接收

s1.rfind(c);即为在s1串中寻找字符c最后一次出现的位置,需要用一个整型变量接收

天梯赛l1级别的一道经典题目可以用到以上知识点供实践

小明打字 (15 分)

格式化输入输出

在使用printf过程之中

在%与格式符直接加上数字n(整数)表示右对齐,数据占n列,若想左对齐则将n改为负值

控制输出位数,在格式符之前加上数字表示输出几位

在使用scanf过程之中

可以使用抑制符*来抑制所读取的数据

例如2022-3-30,我们想要从中得到year,month,day的值

我们可以使用scanf("%4d%*c%2d%*c%2d",&year,&month,&day);轻而易举的完成

注意在使用scanf输入字符串时,不再字符串名前加取地址符&

常用日期计算

闰年的判断方法

if((year%4==0&&year%100!=0)||(year%400==0))

今天由于天梯赛训练,没有复习太多

相关推荐
ULTRA??13 分钟前
Informed RRT*实现椭圆启发式采样
c++·算法
CoderCodingNo26 分钟前
【GESP】C++一级真题 luogu-B4410 [GESP202509 一级] 金字塔
开发语言·c++
超级大福宝26 分钟前
C++中1 << 31 - 1相当于INT_MAX吗?
c语言·c++
alibli40 分钟前
一文学会设计模式之结构型模式及最佳实现
c++·设计模式
A7bert77741 分钟前
【YOLOv5seg部署RK3588】模型训练→转换RKNN→开发板部署
linux·c++·人工智能·深度学习·yolo·目标检测
历程里程碑1 小时前
C++ 10 模板进阶:参数特化与分离编译解析
c语言·开发语言·数据结构·c++·算法
老秦包你会1 小时前
C++进阶------智能指针和特殊类设计方式
开发语言·c++
code bean2 小时前
【CMake 】[第十篇]CMake find_package 完全指南:让第三方库集成变得简单
c++·cmake
IT19952 小时前
C++使用“长度前缀法”解决TCP“粘包 / 拆包”问题
服务器·网络·c++·tcp/ip
Tipriest_2 小时前
旋转矩阵,齐次变换矩阵,欧拉角,四元数等相互转换的常用代码C++ Python
c++·python·矩阵