C++ 语法基础课5 —— 字符串

news2025/7/9 9:19:02

文章目录

  • 1. 字符与整数的联系 —— ASCII码
    • 1.1 练习 — 统计数字和字母个数
  • 2. 字符数组(记得多'\0')
    • 2.1 字符数组的输入输出
    • 2.2 字符数组的常用操作
    • 2.3 遍历字符数组中的字符
  • 3. 标准库类型 string
    • 3.1 定义和初始化
    • 3.2 string 上的操作
      • 3.2.1 string的读写
      • 3.2.2 使用getline读取一整行
      • 3.2.3 string的empty和size操作
      • 3.2.4 string的比较
      • 3.2.5 为string对象赋值
      • 3.2.6 两个string对象相加
      • 3.2.7 字面值和string对象相加
    • 3.3 处理string对象中的字符(重点)

1. 字符与整数的联系 —— ASCII码

  • 每个常用字符都对应一个-128~127的数字,二者之间可以相互转化。
#include <iostream>
using namespace std;

int main()
{
	char c = 'a';
	cout << (int)c << endl;
	
	int a = 66;
	cout << (char)a << endl;
	return 0;
}
  • 常用ASCII值:’A’-‘Z’ 是65~90,’a’-‘z’是97-122,’0’-‘9’是48-57
  • 字符可以参与运算,运算时会将其当做整数:
#include <iostream>
using namespace std;

int main()
{
	int a = 'B' - 'A';
	int b = 'B' * 'A';
	char c = 'A' + 2;
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
	return 0;
}

1.1 练习 — 统计数字和字母个数

  • 输入一行字符,统计出其中数字字符的个数,以及字母字符的个数
#include<iostream>
using namespace std;

int main()
{
    char c;
    
    int numbers = 0, chars = 0;
    while(cin >> c)//读入字符
    {
        if(c >= '0'&&c <= '9') numbers++;
        else if(c >= 'A' && c <= 'z' || c >= 'a'&& c <= 'z') chars++;
    }
    printf("numbers:%d\nchars:%d",numbers,chars);
    return 0;
}

在这里插入图片描述

2. 字符数组(记得多’\0’)

  • 字符串就是字符数组加上结束符’\0’
  • 可以使用字符串来初始化字符数组,但此时要注意,每个字符串结尾会暗含一个’\0’字符,因此字符数组的长度至少要比字符串的长度多1!
#include <iostream>
using namespace std;

int main()
{
	char a1[] = {'C', '+', '+'}; // 列表初始化,没有空字符
	char a2[] = {'C', '+', '+', '\0'}; // 列表初始化,含有显示的空字符
	char a3[] = "C++"; // 自动添加表示字符串结尾的空字符
	char a4[6] = "Daniel"; // 错误,没有空间可存放空字符
	return 0;
}

2.1 字符数组的输入输出

#include <iostream>
using namespace std;

int main()
{
	char str[100];
	cin >> str; // 输入字符串时,遇到空格或者回车就会停止
	cout << str << endl; // 输入字符串时,遇到空格或者回车不会停止
	printf("%s\n",str);
	return 0;
}
  • 读入一行字符串,包括空格
#include <iostream>
using namespace std;

int main()
{
	char str[100];
	gets(str);
	cout << str << endl;
	return 0;

2.2 字符数组的常用操作

  • 下面几个函数需要引入头文件:#include <string.h>
  • (1) strlen(str),求字符串的长度
  • (2) strcmp(a, b),比较两个字符串的大小,a < b 返回-1,a == b 返回0,a >
    b返回1。这里的比较方式是字典序!
  • (3) strcpy(a, b),将字符串b复制给从a开始的字符数组
#include<iostream>
#include<string.h>
using namespace std;

int main()
{
	char a[100] = "hello world!", b[100];
	cout << strlen(a)<< endl;
	strcpy(b, a);
	cout << strcmp(a,b) << endl;
	return 0;
}

2.3 遍历字符数组中的字符

#include<iostream>
#include<string.h>
using namespace std;

int main()
{
	char a[100] = "hello world!";
	for(int i = 0;i < strlen(a);i++) cout << a[i] << endl;
	return 0;
}

3. 标准库类型 string

  • 可变长的字符序列,比字符数组更加好用。需要引入头文件:#include

3.1 定义和初始化

#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s1; // 默认初始化,s1是一个空字符串
	string s2 = s1; // s2是s1的副本
	string s3 = "hiya";// s3是该字符串字面值的副本
	string s4(10, 'C'); // s4内容是ccccccccccc
	return 0;
}

3.2 string 上的操作

3.2.1 string的读写

#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s1,s2;
	cin >> s1 >> s2;
	cout << s1 << s2 << endl;
	return 0;
}
  • 注意:不能用printf直接输出string,需要写成:printf(“%s”, s.c_str())

3.2.2 使用getline读取一整行

#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s;
	getline(cin, s);
	cout << s << endl;
	return 0;
}

3.2.3 string的empty和size操作

  • 注意size是无符号整数,因此 s.size() <= -1一定成立
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string s1, s2 = "abc";
	cout << s1.empty() << endl;
	cout << s2.empty() << endl;
	cout << s2.size() << endl;
	return 0;
}

3.2.4 string的比较

  • 支持 > < >= <= == !=等所有比较操作,按字典序进行比较

3.2.5 为string对象赋值

string s1(10, ‘c’), s2;		// s1的内容是 cccccccccc;s2是一个空字符串
s1 = s2;					// 赋值:用s2的副本替换s1的副本
							// 此时s1和s2都是空字符串

3.2.6 两个string对象相加

string s1 = “hello,, s2 = “world\n”;
string s3 = s1 + s2;					// s3的内容是 hello, world\n
s1 += s2;								// s1 = s1 + s2

3.2.7 字面值和string对象相加

  • 做加法运算时,字面值和字符都会被转化成string对象,因此直接相加就是将这些字面值串联起来。
string s1 = “hello”, s2 = “world”;		// 在s1和s2中都没有标点符号
string s3 = s1 +,+ s2 + ‘\n’;
  • 当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string。
string s4 = s1 +,;	// 正确:把一个string对象和有一个字面值相加
string s5 = “hello” +,; // 错误:两个运算对象都不是string
string s6 = s1 +,+ “world”;  // 正确,每个加法运算都有一个运算符是string
string s7 = “hello” +,+ s2;  // 错误:不能把字面值直接相加,运算是从左到右进行的

3.3 处理string对象中的字符(重点)

  • 可以将string对象当成字符数组来处理
  • char字符数组长度用strlen()
  • string字符串长度使用size()
#include<iostream>
#include<string.h>
using namespace std;

int main()
{
	// char a[100] = "hello world!";
	// for(int i = 0;i < strlen(a);i++) cout << a[i] << endl; 
	string s = "hello world";
	for(int i = 0;i < s.size();i ++) cout << s[i] << endl;
	return 0;
}
  • 或者使用基于范围的for语句
#include<iostream>
#include<string.h>
using namespace std;

int main()
{
	string s = "hello world";
	for(char c : s) cout << c << endl;
	for(char &c : s) c = 'a';
	cout << s << endl;
	return 0;
}

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

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

相关文章

操作系统之启动过程

本文参考MOOC哈工大操作系统课程&#xff0c;需要有一定的汇编基础 打开电源后&#xff0c;计算机做了什么 此时需要先运行的代码是BIOS x86 PC开机后CPU处于实模式&#xff0c;寻址方式为CS:IP&#xff08;CS左移4位IP&#xff09;开机时&#xff0c;初始化的CS0xFFFF&…

_linux 进程间通信(命名管道)

文章目录1. 创建一个命名管道2. 用命名管道实现server&client通信2.0 log.hpp打印日志信息2.1 comm.hpp(server.cc和client.cc共有文件)2.2 server.cc读取数据2.3 client.cc发送数据2.4 结果展示3. 还可以多个进程接收1. 创建一个命名管道 命名管道可以从命令行上创建&…

微服务介绍微服务环境搭建

一、微服务介绍 从互联网早起到现在&#xff0c;系统架构大体经历了下面几个过程: 单体应用架构--->垂直应用架构--->分布 式架构--->SOA架构--->微服务架构&#xff0c;当然还有悄然兴起的Service Mesh(服务网格化)。 微服务架构 微服务架构在某种程度上是面向…

机械原理复习试题及答案

机械原理 一、填空题&#xff1a; 1.机构具有确定运动的条件是机构的自由度数等于 。 2.同一构件上各点的速度多边形必 于对应点位置组成的多边形。 3.在转子平衡问题中&#xff0c;偏心质量产生的惯性力可以用 相对地表示。 4.机械系统的等效力学模型是具有 &#xff0c;其上作…

Word文档中经常会遇到字体间距突然变得很大,怎么处理?

Word文档中经常会遇到字体间距突然变得很大&#xff0c;怎么处理&#xff1f; 目录 Word文档中经常会遇到字体间距突然变得很大&#xff0c;怎么处理&#xff1f; 1、如下图字体间距突然变大。 可能原因一&#xff1a; 1、选中该段文字&#xff0c;鼠标右键选择【段落 】 …

【882. 细分图中的可到达节点】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个无向图&#xff08;原始图&#xff09;&#xff0c;图中有 n 个节点&#xff0c;编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链&#xff0c;每条边之间的新节点数各不相同。 图…

进程替换与复制

目录进程替换基础知识什么是进程替换进程替换函数函数使用execlexeclpexecleexecvexecvpexecve进程替换基础知识 什么是进程替换 进程替换&#xff1a;把当前进程换为其他进程执行。&#xff08;其他进程&#xff1a;创建新进程&#xff0c;生成可执行程序&#xff0c;装在进…

Android 13 Wi-Fi状态机流程及Log分析

本文基于Android 13源码解读,对Wi-Fi状态机调用流程进行梳理,并结合Log进行分析,便于大家理解Wi-Fi模块调用流程。 梳理出Wi-Fi状态机共有如下几种状态: mConnectableState mConnectingOrConnectedState mL2ConnectingState mL2ConnectedState mL3ProvisioningState …

【机器学习项目实战10例目录】项目详解 + 数据集 + 完整源码

前言 大家好&#xff0c;我是阿光。 本专栏整理了《机器学习项目实战10例》&#xff0c;内包含了各种不同的入门级机器学习项目&#xff0c;包含项目原理以及源码&#xff0c;每一个项目实例都附带有完整的代码数据集。 正在更新中~ ✨ &#x1f6a8; 我的项目环境&#xff…

《计算机体系结构量化研究方法第6版》1.4 技术趋势

引入 1、以下五种技术是现代计算机实现所不可或缺的。 &#xff08;1&#xff09;集成电路逻辑技术。晶体管密度每年大约增加35%&#xff0c;相当于每4年翻两番。晶片大小的增长速度比较难以预测&#xff0c;也慢一些&#xff0c;增速为每年10%~ 20%。两者综合起来&#xff0c…

【Linux】CentOS 7安装 MySQL

1. 更改Centos YUM 源 1&#xff09; 备份 yum 源配置文件 &#xff08;在根目录下执行&#xff09; mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak2&#xff09;将官方的 yum 源换成阿里的yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo…

Day12--渲染二级和三级分类列表

1.动态渲染右侧的二级分类列表 我的操作&#xff1a; 1》在cate.vue中&#xff1a; 2》效果图&#xff1a; *********************************** *********************************** *********************************** 2.循环渲染右侧二级分类列表的 UI 结构&#xff1…

RabbitMQ快速入门

中间件&消息队列 中间件概述 中间件&#xff08;Middleware&#xff09;是处于操作系统和应用程序之间的软件&#xff0c;也有人认为它应该属于操作系统中的一部分。人们在使用中间件时&#xff0c;往往是一组中间件集成在一起&#xff0c;构成一个平台&#xff08;包括开…

你不能错过的【Python爬虫】测试3(爬取所有内容 + 完整源代码 + 架构 + 结果)

目录 一、主要工具包 以及 版本二、架构展示三、各部分code3.1 yjs.py (重要)3.2 items.py3.3 middlewares.py3.4 pipelines.py3.5 settings.py3.6 start.py四、结果展示一、主要工具包 以及 版本 scrapy:2.7.1版本(这里主要用到的工具包) 二、架构展示 三、各部分code 3…

MySQL体系-日志与MVCC(源码层面)

MySQL 本身具备生产binlog日志的功能&#xff0c;在InnoDB存储引擎中&#xff0c;为了持久性有了redo log,为了原子性和隔离性有了undo log&#xff0c;最终通过redo log undo log 保证了一致性&#xff1b; 我先画一个InnoDB操作流程&#xff0c;先简单的了解下它们的工作机制…

基于S2SH的保险业务管理系统【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86467452 主要使用技术 SpringStruts2HibernateJSPJSCSSMysql 功能介绍 本系统旨在为当今的保险行业提供一套综合性的管理系统业务&#xff0c;系统的主要用户为保险的购买者以及系统的管理…

10.实用调试技巧

一、调试 1.调试的定义 调试&#xff08;英语&#xff1a;Debugging / Debug&#xff09;&#xff0c;又称除错&#xff0c;是发现和减少计算机程序或电子仪器设备中程序 错误的一个过程。 2.调试的基本步骤 发现程序错误的存在 以隔离、消除等方式对错误进行定位 确定错误产…

Linux系统编程(三)——Linux下的进程

第一篇中总结了系统的环境搭建&#xff0c;第二篇中学习了系统的一些IO函数&#xff0c;接下来就深入到了Linux下的进程线程的实现。 目录 0x01 进程概述 一、进程的信息 二、程序与进程 三、并行与并发 四、进程控制块PCB 0x02 进程状态转换 一、进程的状态 二、进程相…

【C++】哈希-bitset位图与模拟

目录 1.位图 1.1什么是位图 1.2位图的作用 2.bitset应用 2.1bitset构造 2.2bitset成员函数与使用 3.bitset模拟实现 构造函数 set reset test flip count size none,any 1.位图 在前文中我们介绍了哈希的一些内容&#xff0c;接下来我们介绍一个新奇的玩意&am…

回归问题原理

回归问题是一种常见的监督机器学习任务&#xff0c;在很多领域均有广泛应用。其典型应用包括销量预测、库存预测、股票价格预测、天气预测等。本问将讨论线性回归&#xff0c;包括线性回归模型的目标函数&#xff08;损失函数和正则函数&#xff09;、线性回归模型的优化求解、…