C++学习day--07 字符串

news2024/12/29 10:10:12

1、黑客攻击系统-用户输入的优化

1 节 项目需求

1. 用户登录时,用户可能输入很长的用户名。
2. 使用 char 类型和 int 类型,表示用户名和密码,不安全。

 2 节 项目实现

#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
int main(void) {
//char name;
string name;
//int pwd;
string pwd;
std::cout << "请输入账号:";
std::cin >> name;
std::cout << "请输入密码:";
std::cin >> pwd;
system("pause");
return 0;
}
string c++ 特有的一种数据类型, C语言里没有这种类型

 

2、字符串

什么是字符串
字符串就是 0 个或多个“字符”组成的“有序”序列。
IT 史上的“神翻译” - 字符串
1 )由“字符”组成
2 )按照特定的顺序组成
字符串长度
字符串包含的字符个数 ( 不是指中文)。
空字符串的长度是 0
“” 是空字符串常量,没有一个字符,长度是 0
“ ” 是空格字符串常量,包含 1 个空格,长度是 1
“god” 的字符串长度是 3
我爱你 的字符串长度不是 3 ,是 6 9
(在某些编码中,一个汉字占用 2 个直接,有些编码中占 3 个字节)
“” 的字符串长度是 0 (空串)
“ ” 的字符串长度是 1 (含有一个空格)
字符串常量
“字面型”字符串常量,要求用“”扩起来。
printf("name=%s", "Rock"); //C 语言方式输出字符串, %s 用来匹配字符串
cout << “Rock”; //C++方式输出字符串
字符串结束符
c 语言中 ,为了便于存储字符串,要求在最后一个字符的后面存储一个 0 (一个字节)。
这个 0 , 称为“字符串结束符”,常用 ‘\0’ 表示。
“China” => ‘C’ ‘h’ ‘i’ ‘n’ ‘a’ ‘\0’
“” => ‘\0’

 

C++ 语言中,string类型 字符串的最后并没有字符串结束符!
实际存储时,根据编译器的不同,最后可能存储一个字符串结束符,也可能没有。
c/c++ 第一个重要区别的知识点来啦!!
字符串末尾是否有结束符 '\0'

字符串变量的表示 

在 C 语言中,使用 char 类型的数组,来存储字符串变量
注:C 语言中,没有专用的字符串类型。
在 C++中,使用 std::string 类型来表示字符串变量
string 变量的定义、初始化
// 定义了一个字符串变量,此时,该字符串是空字
符串
string girlFriend1;
girlFriend1 = " 王菲 " ; // 把字符串常量 " 王菲 " 拷贝到 girlFriend1
cout << "girlFriend1 = " << girlFriend1 << endl;
string girlFriend2;
girlFriend2 = girlFriend1; // 把字符串变量 girlFriend1 的值拷贝到 girlFriend2
cout << "girlFriend2 = " << girlFriend2 << endl;
// 定义 girlFriend3 的同时,使用字符串常量 " 周迅 " 来初始化
string girlFriend3( " 周迅 " );
cout << "girlFriend3 = " << girlFriend3 << endl;
// 定义 girlFriend4 的同时,使用字符串变量来初始化
string girlFriend4(girlFriend3);
cout << "girlFriend4 = " << girlFriend4 << endl;
string girlFriend5(10, 'A' );
cout << "girlFriend5 = " << girlFriend5 << endl;

大家自己手动悄悄敲一下这个代码,看看结果。 

string 变量的输入、输出
使用 std::cin >> 输入
从第一个非空白字开始,直到遇到 空白字符 时停止输入
空白字符是指: 空格,制表符,回车符
使用 std::cout << 输出
使用 std::cout << 输出
demo1- 基本的输入输出
string job;
cout << " 你是做什么工作的? " << endl;
cin >> job;
cout << " " << job << " ,收入一定不错吧? " << endl;

 demo2-自动跳过空白字符

string university; //大学

string profession; // 专业
cout << " 你是哪个学习毕业的?学什么专业 ? " ;
// 输入 :
清华 考古 hello
// 自动跳过空白字符
cin >> university >> profession;
cout << university << " " << profession << " 专业不错哦! " << endl;
连续输入时自动跳过空格,而 C语言的scanf 输入连续不同类型的数据时,要手动添加空格。这点是C++比C语言更好的地方。

 

demo3 - 连续输入多个字符串,个数不确定
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
int main( void ) {
string food; // 专业
int i = 0;
cout << " 你喜欢什么美食 ? " ;
while (cin >> food) { // 当用户输入 Ctrl + z 并回车 cin >> food 返回 0, 0 就是假
i = i + 1;
cout << " 你喜欢的第 " << i << " 美食是: " << food << endl ;
cout << " 你还喜欢吃什么美食 ? " ;
}
cout << " 你最喜欢的美食有 " << i << " " << endl;
system( "pause" );
return 0;
}
看到这里,就不得不提一下之前刷到的一个题,就是输入一组数据,但是数据个数不确定,那个题其实想考察就是不确定数据的输入,
demo4 - 读取一行 getline
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
int main( void ) {
string addr; // 专业
cout << " 你想到哪里去旅行: " ;
// 从标准输入设备读取一行,但是不包括最后输入的回车符
getline(cin, addr);
//empty 方法
if (addr.empty() == true ) {
cout << " 您输入了一个空行 " << endl;
return 1;
}
//size() length() 完全等效
// 长度是指字符串占用的字节数,如果含有汉字,那么总的字节数和汉字个数不同
cout << " 地址的长度是: " << addr.size() << endl;
cout << " 地址的长度是: " << addr.length() << endl;
system( "pause" );
return 0;
}
这个输入就是在这一行你输入什么就是 什么,它不会遇到空格就结束输入。可 见,比C 语言 scanf 确实要好很多。

 更多C和C++的输入总结我们通过例子来讲解。

例如:

string 字符串的比较
比较规则:和 C 语言相同。从字符串的第一个字符开始,对应字符逐个比较,直到遇到不相等的字符为止。
比较运算符有:
>   >=   <   <=   ==
比较运算的结果: 逻辑真, 逻辑假
“123” < “1230 ”            真
“19” > “123456789”    真
2 > “1999”                真
“123” == “123”            真
“123” == “1230”          假
小拓展:
注意: 1 、在 java 中,用 == 比较的是俩字 符串的地址。
2 、在 C++ 中,比较的字符串的内容,但是比较结果是逻辑值:真或者假。但是一般不用这种方式来比较。
3 、真正比较字符串的内容是要调用库里的函数进行比较,比较结果只有三种:大于0 小于 0 等于 0

看一个案例:

#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
int main( void ) {
string myGirl = " 小芳 " ;
string yourGirl;
cout << " 我喜欢的女孩子是 " << myGirl << endl;
cout << " 你喜欢的女孩是: " ;
cin >> yourGirl;
if (myGirl == yourGirl) {
cout << " 我们喜欢同一人,过来决斗吧 " << endl;
} else {
cout << " 祝你幸福 " ;
}
system( "pause" );
return 0;
}

注意:c 语言的字符串,不能使用这个方式来进行字符串比较,即char数组存储字符串不能通过“==”来比较大小,只能通过库函数来比较。 

string 字符串的加法
+ 左侧的字符串,和 + 右侧的字符串,直接拼接成一个新的字符串
注意顺序。( C 语言的字符串不支持该方式
注意与数学中的“加法”不同:
100+ 200  等于 “300”
“100” + “200” 等于 “100200”

案例:

#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
int main( void ) {
string s1 = " 武当派 " ;
string s2 = " 张三丰 " ;

string s3 = " 太极拳 " ;
string s4;
s4 = s1 + s2; // 武当派张三丰
cout << "s4=" << s4 << endl;
s4 = s4 + s3; // 武当派张三丰太极拳
// 相当于 s4 += s3;
cout << "s4=" << s4 << endl;
s4 += " 第一式 " ;
// 等效于: s4 = s4 + " 第一式 ";
cout << "s4=" << s4 << endl;
system( "pause" );
return 0;
}
c++ 里的字符拼接和 java语言里的字符拼接机制不一样。java里的拼接可以是任意数据类型。而c++ 只能拼接字符串类型。

 C 语言风格的字符串 char 数组

c 语言中,字符串是以“字符数组”(char[ ])存储的。

#include <iostream>
#include <Windows.h>
#include <stdio.h>
using namespace std;
int main( void ) {
//C 语言风格的字符串
char name[32];
/*
使用 C 语言的函数,来处理 C 语言字符串
printf(" 请输入您的名字: ");
scanf("%s", name);
printf("%s, 你好! \n", name);
*/
// 使用 C++ 的方式,来处理 C 语言字符串
cout << " 请输入您的名字: " ;
cin >> name;//C++处理C语言类型的数据
cout << name << ", 你好! " << endl;
system( "pause" );
return 0;
}
C 语言的数据类型可以用c++ 的方式来对其操作。

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

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

相关文章

MacBook重置与推荐软件配置

Mac OS 12.6.5 前言重置初始化配置说明 GitJava 8 & Maven & MysqlJava 8mavenMySQL配置 MotrixDBeaver添加aliyun的maven至DBeaver添加MySQL VS CodeSteamTyporaiStas Menus 前言 用了一年的机械革命游戏本,机器加外设20斤的重量背过几次出门后就再也不想带出门了,运行…

PyYaml反序列化漏洞

0x01 HDCTF 遇到预期解是考的yaml了&#xff0c;前来学习下 语法 语法就不贴了&#xff0c;其他文章有介绍 语法和 yml配置文件的 语法差不多 就不一一介绍 漏洞成因与利用 PyYaml < 5.1 在python 中 pyyaml是提供 python 和Yaml 两种语言的转换&#xff0c;与pickle 类…

C++20协程

简介 ​ C20协程只是提供协程机制&#xff0c;而不是提供协程库。C20的协程是无栈协程&#xff0c;无栈协程是一个可以挂起/恢复的特殊函数&#xff0c;是函数调用的泛化&#xff0c;且只能被线程调用&#xff0c;本身并不抢占内核调度。 ​ C20 提供了三个新关键字(co_await…

【DRF配置管理】如何建立swagger风格api接口文档

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 DRF应用和管理 【DRF配置管理】Django安装和使用DRF框架 【DRF配置管理】如何在视图函数配置参数(一) 【DRF配置管理】如何在视图函数配置参数(二) 【…

C. Enlarge GCD(内存的限制 + 数组的访问速度)

Problem - C - Codeforces Mr. F 有 n 个正整数 a1,a2,…,an。 他认为这些整数的最大公约数太小了。所以他想通过删除其中一些整数来扩大它。 但是这个问题对他来说太简单了&#xff0c;所以他不想自己做。如果你帮他解决这个问题&#xff0c;他会给你一些奖励分数。 你的任…

AntDB数据库携手金蝶Apusic应用服务器, 共促信创产业繁荣发展

日前&#xff0c;湖南亚信安慧科技有限公司&#xff08;简称&#xff1a;亚信安慧&#xff09;与深圳市金蝶天燕云计算股份有限公司&#xff08;简称&#xff1a;金蝶天燕&#xff09;完成AntDB数据库与金蝶Apusic服务器软件V9.0、V10产品的兼容互认&#xff0c;兼容性良好&…

不是吧,3 : 00 面试,还没10分钟就出来了,问的也太...

从外包出来&#xff0c;没想到死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到2月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内推我去…

Android WebRtc+SRS/ZLM视频通话(3):安装ZLMediaKit

Android WebRtcSRS/ZLM视频通话&#xff08;3&#xff09;&#xff1a;安装ZLMediaKit 来自奔三人员的焦虑日志 接着上一章内容&#xff0c;继续来记录ZLMediaKit的安装&#xff0c;这里的ZLMediaKit实际上和SRS的功能差不多&#xff0c;都是国内流媒体服务框架使用人数比价多&…

【SpringBoot】MyBatis与MyBatis-Plus分页查询问题

笔者写这篇博客是因为近期遇到的关于两者之间的分页代码差距&#xff0c;其实之前也遇见过但是没有去整理这篇博客&#xff0c;但由于还是被困扰了小一会儿时间&#xff0c;所以还是需要加深记忆。其实会看前后端传参解决这个问题很快、不麻烦。关于这两个框架的分页代码问题主…

物联网|整体介绍|蓝牙4.0BLE信道分析与拓扑分析|物联网之蓝牙4.0 BLE基础-学习笔记(1)

文章目录 课程整体介绍1、蓝牙4.0自身的优点2、开设这门课的重要性3课程的总体规划4.课程目的5.培训对象 蓝牙4.0BLE信道分析与拓扑分析蓝牙4.OBLE信道分析柘扑分析星型拓扑结构:扮演角色广播结构;星型结构的建立过程: 课程整体介绍 为什么我们要开设这么课程呢? 1、蓝牙4.0…

JDK17新特性之--JDK9到JDK17 String 新增的新方法

JDK9之后对String底层存储数据结构进行了重大的修改1&#xff0c;同步也增加了许多新的方法&#xff0c;主要有Text Blocks、chars()、codePoints()、describeConstable()、formatted()、indent()、isBlank()、isEmpty()、lines()、repeat()、strip()、stripLeading()、stripIn…

判断大小端的错误做法

这里不详细讲解大小端的区别&#xff0c;只讲解判断大小端的方法。 1.大端&#xff0c;小端的区别 0x123456 在内存中的存储方式 大端是高字节存放到内存的低地址 小端是高字节存放到内存的高地址 2.大小端的判断 1.错误的做法 int main() {int a0x1234;char c(char)a;if(…

CSS-Flex布局

01-标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 02-浮动 基本使用 作用&#xff1a;让块元素水平排列。 属性名&#xff1a;float 属性值 left&#xff1a;…

全志H3-nanopi-duo2开发板GPIO驱动开发

1:获取对应开发板duo2的内核源码 从官网获取 [friendlyarm的nanopi-duo2](https://wiki.friendlyelec.com/wiki/index.php/NanoPi_Duo2/zh#.E5.AE.9A.E5.88.B6.E5.91.BD.E4.BB.A4.E8.A1.8C.E7.9A.84.E6.AC.A2.E8.BF.8E.E4.BF.A1.E6.81.AF.EF.BC.88.E6.96.87.E5.AD.97LOGO.EF.B…

使用开源项目管理系统 Redmine 的优缺点

redmine是什么软件&#xff1f;Redmine是一款基于Ruby on Rails框架开发的开源项目管理软件&#xff0c;具有丰富的功能和高度可定制性。主要功能包括项目管理、问题跟踪、文档管理、时间跟踪以及多种报表。要安装使用Redmine&#xff0c;首先需要搭建Ruby on Rails运行环境&am…

网页和原生程序的交互方案

1 ActiveX和BHO是微软开发且闭源的&#xff0c;仅适用于IE 这里就不讨论了&#xff0c;这种方式会给用户带来很大的安全风险。而且也不符合html5标准&#xff0c;现在已经被市场抛弃。 2 搜索挂接&#xff08;URL SEARCHHOOK) 在window系统中&#xff0c;通过在注册表中&…

3.1 Linux启动Shell

系列文章目录 第1章 Linux Shell简介 第2章 Shell基础 第3章 Bash Shell基础命令 <本章所在位置> 第4章 Bash Shell命令进阶 第5章 Linux Shell深度理解 第6章 Linux环境变量 第7章 Linux文件权限 第8章 Linux文件系统的管理 第9章 Linux软件安装 第10章 Linux文本编辑器…

框架不是框框—应用框架的基本思想

软件构件化是21世纪软件工业发展的大势趋。工业化的软件复用已经从通用类库进化到了面向领域的应用框架。Gartner Group认为&#xff1a;“至少70%的新应用将主要建立在如软件构件和应用框架这类‘构造块’之上&#xff1b;应用开发的未来就在于提供一开放体系结构&#xff0c;…

http状态码301、302及304

http状态码分类&#xff1a; 1**&#xff1a;服务器收到请求&#xff0c;需要请求者继续执行操作 2**&#xff1a;成功&#xff0c;操作被成功接收并处理 3**&#xff1a;重定向&#xff0c;需要进一步的操作以完成请求 4**&#xff1a;客户端错误&#xff0c;请求包含语法错误…

Meta内容总监:Quest最初并非侧重游戏,VR用户画像每年都在变

2019年&#xff0c;随着Oculus Quest的发布&#xff0c;Quest应用商店应运而生。仅仅4年时间&#xff0c;就成为了发展速度最快的VR平台&#xff0c;吸引越来越多的开发者进入到Quest中去&#xff0c;并关注到VR生态。截至去年10月&#xff0c;Quest商店交易规模达15亿美元&…