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 = " 王菲 " ; // 把字符串常量 " 王菲 " 拷贝到 girlFriend1cout << "girlFriend1 = " << girlFriend1 << endl;string girlFriend2;girlFriend2 = girlFriend1; // 把字符串变量 girlFriend1 的值拷贝到 girlFriend2cout << "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++
的方式来对其操作。