小樽C++ 单章④ 字符数组与字符串

news2025/8/7 19:12:00

目录

一、字符与数组

1.求字符数组的长度

2.查找单词

二、字符串与数组

2.1 字符串倒序输出

2.2 字符串比较

2.3 大写字母输出

​编辑

三、字符串常用函数

一、初始化字符串:

二、字符串操作:(增删改查)

三、截取与替换字符串

四、替换字符串的某值

四、应用题

1.后缀

2.开学消消乐

3.找最长最短单词


一、字符与数组

字符串:由多个字符构成的连续成一串就是字符串。

注意区分字符'a' 和字符串"a";字符是单引号,字符串是双引号。

字符是指单个的字符,字符串由任意数量的字符,比如"abc"、 "a 8A"

如果我们将一个字符串拆开:

例如:"hello"  : 'h','e','1','1','o','\0'

这里一定要注意,所有字符串末尾,都会由系统自动添加一个'\0' 作为结尾,也就是说一个长度为 5的字符串,实际需要占用6个单元空间。

在这里插入图片描述

1.字符数组定义:char a[100];

2.字符数组赋值:char b[100] ="hello";

b[0] =        b[1] =        b[2] =        b[3] =        

字符数组输入的可以直接用cin输入值,可以不用for循环输入。这是跟一维数组不同的特点!


1.求字符数组的长度

通过'\0'代表字符串结束,那循环判断条件用'\0'。

看到上面代码,求个字符串长度这么麻烦,那有什么简单的方法?

导入库<cstring>,调用 strlen()函数,即可获取字符串长度。

#include <iostream>
#include <cstring>
using namespace std;
int main() {
    char s[1000];   
    int len = 0;//int整数 
    cin >> s;//s="hello",以'\0'结尾 
    for(int i=0; s[i] != '\0'; i++){//s[0]='h',s[1]='e'
        len++;
    }
    cout << len << endl;//len=5
    
    int len2 = strlen(s);
	cout<<"长度2:"<<len2;
    return 0;
}


2.查找单词

 

在字符串中找某一个单词出现的次数,例如 字符串hihellohi, "hi" 出现了2次。

#include <iostream>
#include <cstring>
using namespace std;
int main() {
    char s[] = {"hi"};
    char a[1000];
    int ans = 0;
    cout<<"请输入字符串:"; 
    cin >> a; // hihellohi
    int len=strlen(a);
    for(int i=0;i<len-1;i++){//选取开始对比位置
        bool flag = true;
        for(int j=0;j<2;j++){   //从第a[i]个开始对比
            if(a[i+j]!=s[j]){       //发现没有匹配上
                flag = false;       //标记没配对上
                break;              //结束循环
            }
        }
        if(flag == true){
            ans++;
        }
    }
    cout <<"匹配相等有:"<< ans << endl;
    return 0;
}


二、字符串与数组

1.字符数组定义:string s;

2.字符数组赋值:string b = “hello”;

b[0] =        b[1] =        b[2] =        b[3] =        

3.字符串长度:字符数组类似,导入库<string>,用变量名.size(),即可。

例如:s.size()

2.1 字符串倒序输出

例如输入 “hello”,倒序输出就是:“olleh”。

#include <iostream>
#include <string>
using namespace std;
int main() {
    string s;
	cin>>s;
	cout<<"长度:"<<s.size()<<endl; 
	for(int i=s.size()-1;i>=0;i--){
		cout<<s[i];
	} 
	return 0; 
} 

2.2 字符串比较

规则:两个字符串从左往右看;先比首字符,通过ASCII码比大小,如果两个字符串首字母不一致,那哪个字符大就代表哪个字符串大! 跟字符串长度无关。当同位置的字符一致时,继续往后比,知道比完,再看哪个字符串长度长。

例如:

Abc 与 Abd        哪个大?        

Abcd 与 Bab       哪个大?        

Abcd 与 Abcde     哪个大?        

请输入两个字符串s1,s2; 比较两个字符串的大小,如果s1>s2就输出>, 否则如果s1=s2就输出=,否则就输出<。而且要实现可重复不断地比较!

#include <iostream>
#include <string>
using namespace std;
int main() {
    string s1, s2;
    while(1){
        cin>>s1>>s2;
        if(s1>s2){
            cout<<s1<<'>'<<s2<<endl;
        }if(s1<s2){
            cout<<s1<<'<'<<s2<<endl;
        } if(s1==s2){
            cout<<s1<<'='<<s2<<endl;
        }
    }
    return 0;
}

2.3 大写字母输出

输入一个字符串,把字符串中大写的字母输出来。

#include <iostream>
#include <string>
using namespace std;
int main(){
//	输入字符串s1,有大小写,只输出大写字母
	string s1;
	cin>>s1;
	for(int i=0;i<s1.size();i++){
		if(s1[i]>='A' && s1[i]<='Z'){
			cout<<s1[i]<<" ";
		}
	} 
	return 0;
}

整行读取 与 拼接字符串

getline(), 整行(有空格)读取字符串。

我们知道输入字符串,空格隔开,再输入字符串是代表输入两个字符串。但如果我们字符串本身就要输入空格怎么办?

格式:getline(cin,变量);

使用+拼接字符串 s1 + s2。

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main(){
	string s;
	getline(cin,s);
	string s2="I am good";
	cout<<endl<<s+s2; 
}


三、字符串常用函数

一、初始化字符串:

  1. 导入库 include<string>
  2. 定义与赋值

定义一个字符串:string s = “hello jxz”;

二、字符串操作:(增删改查)

查找操作:find函数查找

格式:变量名.find("查词"),有就返回一个"查词"的索引位置。

如果find函数没有找到会返回string::npos,可以通过if判断有无找到。

#include<iostream>
#include<string>
using namespace std;
int main(){
	string s;
	cin>>s; // hihellohello 
//	字符串的增删改查
//	 用法:变量名.find("查"),返回一个索引 
	cout<<s.find("he")<<endl; 	//输出索引位置 
	cout<<s.find("llo")<<endl;  //输出索引位置
	
	if(s.find("hllo") != string::npos){ //找得到的意思 
		cout<<s.find("hllo");
	}
	else{
		cout<<"找不到"; 
	}
    return 0;
}

插入操作:变量名.insert(索引,值)

cout << s.insert(2,“hi”); //索引2位置插入

s.insert(0, "before"); // 首位置插入

s.insert(s.size(), "end");  // 末尾位置插入

练1:定义字符串数组s[2];输入第一个、第二个字符串。

查找,第一个字符串s[0]是否包含s[1]第二个字符串,有就输出该位置,否则输出NO。

    string s[2];
    cin>>s[0]>>s[1];
    if(s[0].find(s[1]) != string::npos){
    	cout<<s[0].find(s[1]);
	}
	else{
		cout<<"NO!";
	}

 练2:定义声明存储3个字符串姓名的数组,循环输入值;在它的第0个位置上加上字符串Mr. ,最后把最新的结果输出出来。

    string names[3];
	for(int i=0;i<3;i++){
		cin>>names[i];
		names[i].insert(0,"Mr. ");
	} 
	for(int i=0;i<3;i++){
		cout<<names[i]<<" ";
	}

练3:数字签名是对文本进行加密的一种方式,我们接下来要运用学到的字符串的插入和查找函数,对一串文本进行加密。这一串文本如果出现数字66,则在第一个66之前插入“jiami”;否则就将文本原本输出。

//数字加密

    string text;
    cin >> text;
    if(text.find("66") != string::npos){
    	cout<<text.insert(text.find("66"),"jiami")<<endl;
	}
	else{
		cout<<text;
	}


三、截取与替换字符串

截取一小段的字符串: s.substr(位置,长度)

定义字符串 string s = "eat good!"; 我们只要字符串的一部分good!

cout<<s.substr(4);

cout<<s.substr(0,3); //我们只要获取eat  3的位置是截取的长度

练4:对上面的名字字符串操作。在这里,我们希望把每一个读入的字符串的第2到第6个字符截取并输出。请在读入每个字符串后,将每个字符串赋值为截取后的结果。

string names[3];
for (int i = 0; i < 3; i++) {
        cin >> names[i];
        names[i]=names[i].substr(1,5);
    }
    for (int i = 0; i < 3; i++) {
        cout << names[i] << endl;
}


四、替换字符串的某值

 s.replace(位置,长度,"替换值");

练5:接着把上面的截取操作变成替换操作;把字符串的第2到第6个字符替换为“ABC”。


   string names[3];
    for (int i = 0; i < 3; i++) {
        cin >> names[i];
        names[i].replace(1,5,"ABC");
    }
    
    for (int i = 0; i < 3; i++) {
        cout << names[i] << endl;
}

练6:字符串 s = "13sb344sbhsbjksbk",输出要消除空格。结果:13344hjkk

  1. 1. 思路:定义完变量s,就循环:满足s.find(" ") != string::npos 执行程序
  2. 2. 用替换replace() 把空格" "替换为""即可。最后循环结束,输出字符串s。
    string s = "13 344 h jk k";
	for(int i=0;s.find(" ") != string::npos;i++){
		s = s.replace(s.find(" "),1,"");
	}
	cout<<s;
	return 0;

四、应用题

1.后缀

#include<iostream>
using namespace std;
int main(){
	string s;
	cin>>s;
	int len = s.size();
	if(s[len-2]=='e' && s[len-1]=='r'){
		for(int i=0;i<len-2;i++){
			cout<<s[i];
		}
	}
	else if(s[len-2]=='l' && s[len-1]=='y'){
		for(int i=0;i<len-2;i++){
			cout<<s[i];
		}
	}
	else if(s[len-3]=='i' && s[len-2]=='n' && s[len-1]=='g'){
		for(int i=0;i<len-3;i++){
			cout<<s[i];
		}
	}
	else{
		cout<<s;
	}
	return 0;
}


2.开学消消乐

 

 

#include <iostream>
#include <string>
using namespace std;
int main() {
    string s;
    cin >> s;
    for(int i=0;i<s.size();i++){
        string a = s.substr(i,3);
        if(a[0]==a[1]&&a[1]==a[2]){
            //cout<<a<<endl;
            s.replace(i,3,"");
            i=-1;
        }
    }
    cout<<s;
}

 

3.找最长最短单词

#include <iostream>
#include <string>
using namespace std;
int main() {
    string s;
    cin >> s;
    for(int i=0;i<s.size();i++){
        string a = s.substr(i,3);
        if(a[0]==a[1]&&a[1]==a[2]){
            //cout<<a<<endl;
            s.replace(i,3,"");
            i=-1;
        }
    }
    cout<<s;
}

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

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

相关文章

从0开始学python -48

Python MySQL - mysql-connector 驱动 MySQL 是最流行的关系型数据库管理系统&#xff0c;如果你不熟悉 MySQL&#xff0c;可以先学习 MySQL 教程。 本章节我们为大家介绍使用 mysql-connector 来连接使用 MySQL&#xff0c; mysql-connector 是 MySQL 官方提供的驱动器。 我…

DoubleAccumulator 源码详解

DoubleAccumulator 简介 这个类是新增的并发统计工具&#xff0c;可以多线程安全计数。 他的构造方法有两个参数&#xff0c;分别是统计方法和初始值。所以具体的统计是加减乘除是由传入的操作方法决定的。 public DoubleAccumulator(DoubleBinaryOperator accumulatorFunct…

​力扣解法汇总1599. 经营摩天轮的最大利润

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 你正在经营一座摩天轮&#xff0c;该摩天轮共有 4 个座舱 &#xff0c;每个座舱…

Kubernetes调度之Pod亲和性

Kubernetes调度中的Pod亲和性abstract.pngPod亲和性节点亲和性&#xff0c;是基于节点的标签对Pod进行调度。而Pod亲和性则可以实现基于已经在节点上运行Pod的标签来约束新Pod可以调度到的节点。具体地&#xff0c;如果X上已经运行了一个或多个满足规则Y的Pod&#xff0c;则这个…

在ubuntu上(docker虚拟环境)部署完laravel的环境后如何运行一个基础的laravel项目

先测试laravel有没有安装成功 laravel如果报laravel command not found&#xff0c;先测试是否安装成功 find / -name laravel出现结果&#xff1a; 说明已经安装成功只是没有配环境变量 要么进这些文件夹测试那个路径下有真的laravel可执行文件&#xff0c;要么每个分别配置…

MCP2515国产替代DP2515带有SPI 接口的独立CAN 控制器

DP2515是一款独立控制器局域网络&#xff08;Controller AreaNetwork&#xff0c; CAN&#xff09;协议控制器&#xff0c;完全支持CAN V2.0B 技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧。DP2515自带的两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要的…

图像处理--基于像素层面

python 图像锐化 图像锐化可以使图像的边缘更加清晰&#xff0c;增强图像的细节。常见的图像锐化算法有拉普拉斯算子、Sobel算子、Prewitt算子等。下面是使用拉普拉斯算子实现图像锐化的Python代码&#xff1a; import cv2 import numpy as npdef laplacian_sharpen(img, ksi…

MySQL日志文件

文章目录1.MySQL中的日志文件2.bin log的作用3.redo log的作用4.bin log和redo log的区别&#xff08;1&#xff09;存储的内容&#xff08;2&#xff09;功能&#xff08;3&#xff09;写入时间&#xff08;4&#xff09;写入方式5.两阶段提交6.undo log的作用1.MySQL中的日志…

springcloud3 fegin实现服务调用1

一 Fegin的作用 1.1 fegin的作用 fegin是一个声明式的web服务客户端&#xff0c;让编写web服务器客户端变得非常容易&#xff0c;只需创建一个接口并在接口中添加FeginClients注解即可。 Fegin的使用方式&#xff1a;使用fegin的注解定义接口&#xff0c;调用这个接口&#…

BI软件工具也有ChatGPT

ChatGPT最近大火&#xff0c;朋友圈、聊天群啊到处都在分享它、讨论它。我也凑了个热闹&#xff0c;先和它聊了一下孩子学习上的困惑&#xff0c;然后用它给孩子出了一套易错题型的练习题&#xff0c;缓解了我做为熊孩子家长的压力。ChatGET能做的可不止这些&#xff0c;还能写…

MTK平台开发入门到精通(休眠唤醒篇)休眠唤醒LPM框架

文章目录 一、lpm驱动源码分析二、设备属性调试文件沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍 lpm 驱动源码分析。 mtk 平台下,其默认的 lpm 机制的源码位置:drivers/misc/mediatek/lpm/ 一、lpm驱动源码分析 目录:drivers/misc/mediatek/lpm/…

aardio 编程语言

今天看到一篇文章《独自坚持 17 年&#xff0c;aardio 作者&#xff1a;“因妻子患癌&#xff0c;再无精力维护项目”》&#xff0c;才知道有个这个项目&#xff0c;也算是很有情怀的一个开发者&#xff0c;对程序有着真挚的热忱&#xff0c;aardio &#x1f50a; 专注于桌面软…

Unity Avatar Cover System - 如何实现一个Avatar角色的智能掩体系统

文章目录简介变量说明实现动画准备动画状态机State 状态NoneStand To CoverIs CoveringCover To Stand高度适配高度检测脚部IK简介 本文介绍如何在Unity中实现一个Avatar角色的智能掩体系统&#xff0c;效果如图所示&#xff1a; 初版1.0.0代码已上传至SKFramework框架Package…

数据库系统-关系模式

二、DB的抽象与演变 2.1 DB的标准结构 DBMS管理数据的三个层次 ● (局部模式)Entrenal Level 外部层次 User Level 用户层次 ○ 用户能够看到雨处理的数据&#xff0c;全局数据中的某一部分 ● (全局模式)Conceptual Level 概念层次 Logic Level 逻辑层次 ○ 从全局角度理解…

【Linux】编译器gcc g++和调试器gdb的使用

文章目录1.编译器gcc/g1.1C语言程序的翻译过程1.预处理2.编译3.汇编4. 链接1.2 链接方式与函数库1.动态链接与静态链接2.动态库与静态库1.3 gcc与g的使用2.调试器gdb2.1debug和release2.2gdb的安装2.3gdb的使用2.4gdb的常用指令3.总结1.编译器gcc/g 1.1C语言程序的翻译过程 1…

一个ELF文件分析和逆向的过程

CrackMe1、2分析和逆向的过程 1. CrackMe1、2相关信息 CrackMe1 1、CrackMe1是一个ELF可执行文件&#xff0c;可在Android中独立执行 2、通过adb(Android SDK中默认带有adb工具)将CrackMe1 push到远程Android设备中&#xff0c;建议放在/data/local/tmp目录下 3、打开adb shel…

关于MSVCR100.dll、MSVCR100d.dll、Msvcp100.dll、abort()R6010等故障模块排查及解决方法

一、常见故障介绍  最近在开发相机项目&#xff08;项目细节由于公司保密就不介绍了&#xff09;&#xff0c;程序运行5个来月以来首次出现msvcr100.dll故障等问题&#xff0c;于是乎开始了分析之路&#xff0c;按照度娘上的一顿操作&#xff0c;期间也是出现了各种不一样的问…

Lombok常见用法总结

目录一、下载和安装二、常见注释&#xff08;一&#xff09;Data&#xff08;二&#xff09;Getter和Setter&#xff08;三&#xff09;NonNull和NotNull&#xff08;不常用&#xff09;&#xff08;四&#xff09;ToString&#xff08;不常用&#xff09;&#xff08;五&#…

一款丧心病狂的API测试工具:Apifox!

你好&#xff0c;我是测试开发工程师——凡哥。欢迎和我交流测试领域相关问题&#xff08;测试入门、技术、python交流都可以&#xff09; 我们平时在做接口测试的时候&#xff0c;对于一些常用的接口测试工具的使用应该都非常熟悉了&#xff1a; 接口文档&#xff1a;Swagge…

Databend 开源周报 第 83 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.com 。Whats New探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。Support for WebHDFSHDFS 是大数…