C++字符串
上节我们讲了两种类型的常量。C++两种类型的常量
本节我们介绍关健的字符串。本节较长,可使用目录跳过:
- 什么是字符串: 字符串就是0个或者多个“字符”组成的“有序”序列
由字符组成:例如“man”,“woman”等按照特定顺序组成的。 - 字符串长度:
字符串包含的字符个数(英文字符)
“”是空字符串常量,没有一个字符,长度为0
“ ”是空格字符串常量,包含一个空格,长度为1
“chat”的字符串长度是4
“聊天”的字符串长度不是2,是4或6(某些编码中汉字占两个字节,有些是三个字节) - 字符串常量: 之前也提到过,用英文双引号括起来的字符串。例如:“聊天”,“玩”等
- 字符串结束符:
在C语音中,为了便于储存字符串,要求在最后一个字符的后面存储一个0(一个字节)。
这个0称为字符串结束符,常用‘\0’表示。
例如:”man“ 就是’m’,‘a’,n’,’\0’。
注意: C++的字符串最后面并没有字符串结束符!即string
实际存储时,根据编译器的不同,最后可能储存0也可能没有。 - 字符串变量的表示:
在C语言中,使用char
类型的数组,来储存字符串变量。
注:C语言中,没有专用的字符串类型。
在C++中,使用std::string
来定义字符串变量。
string变量的定义、初始化
-
需要使用
string
类型,需要包含头文件#include<string>
#include<iostream> #include<string> int main(){ //情况一 //定义一个字符串,此时它的值为空,即空字符串 std::string name1; //给字符串赋值,即拷贝字符串到变量 name1 = "老王"; std::cout << "名字:" << name1 << std::endl; //情况二 //定义一个字符串表示绰号 std::string name2; //将name1的值拷贝给name2; name2 = name1; std::cout << "名字:" << name2 << std::endl; //第三种赋值情况,创建对象的用法!(以后在讲) //把值设置为“老王” //说明:定义变量的同时,设置一个值,一般称为“初始化” std::string name3("老张"); std::cout << "名字:" << name3 << std::endl; //情况四 std::string name4(name3); std::cout << "名字:" << name4 << std::endl; //情况五,,不常用 //表示用10个字符B组成字符串 //等效于std::string name5("BBBBBBBBBB") std::string name5(10, 'B'); std::cout << "名字:" << name5 << std::endl; return 0; }
输出结果:
名字:老王 名字:老王 名字:老张 名字:老张 名字:BBBBBBBBBB
-
上面出现了
string
变量的五种定义、初始化的情况,情况一到四使用普遍,效果相同。
对上面出现的情况进行详细分析:-
情况一:
//将老王赋值给一个新定义的字符串变量
std::string name1;
name1 = "老王";
等效于std::string name1 = "老王";
-
情况二:
拷贝name1
到name2
中
std::string name2 = name1;
-
情况三:
使用另一种方式将"老张"赋值给name3
std::string name3("老张");
-
情况四:
拷贝name3
到name4
中
std::string name4(name3);
-
情况五:(不常用)
给name5赋值10个B
std::string name5(10, 'B');
等效于std::string name5 = "BBBBBBBBBB";
-
string变量的输入和输出
-
使用
std::cin >>
输入从第一个非空白字符开始,直到遇到空白字符时停止输入
空白字符是指:空格、制表符、回车符 -
使用
std::cout <<
输出
#include<iostream>
#include<string>
using namespace std;
int main(){
string name; //姓名
string favorite; //爱好
//输入与输出
//从第一个非空白字符(空格,制表符,回车)开始,直到遇到空白字符为止。
cout << "你的名字是什么?" << endl; //控制台输出
cin >> name; // 控制台输入
cout << "叫" << name << ", 真是个不错的名字。" << endl;
cout << "那你的爱好呢?";
cin >> favorite;
cout << "巧了,我也喜欢" << favorite << endl;
return name;
}
- 上面进行了字符串的输入与输出。
- 输出按照格式输出
- 输入时:如果输入 王五"空白字符"唱歌
那么name
的值为”王五“,favorite
的值为”唱歌“。
注意: 如果输入 王“空格”五"空格"唱”空格“歌
那么name
的值为王,favorite的值为五。
唱 歌 被存在了键盘缓冲区,直到被下一个变量接收,或者程序结束
- 下面看一个要求:连续输入多个字符串,且输入的字符串个数不确定。
直到输入结束时(按下ctrl + z 并回车)
#include<iostream>
#include<string>
using namespace std;
int main(){
string food;//食物
int count = 0;
//需要使用循环语句
//当括号里面的条件为真时,进行循环
//使用 cin >> 输入时,如果遇到文件结束符(ctrl + z),就返回0(假),否者返回真
while(cin >> food){
count = count + 1;
cout << "你最喜欢的第" << count << "种食物是" << food << endl;
}
cout << "你最喜欢吃的食物有" << count << "种" << endl;
return 0;
}
输入:苹果 香蕉 草莓 面包 米饭 按下ctrl + z回车
结果:
你最喜欢的第1种食物是苹果
你最喜欢的第2种食物是香蕉
你最喜欢的第3种食物是草莓
你最喜欢的第4种食物是面包
你最喜欢的第5种食物是米饭
你喜欢吃的食物有5种
- 上面的例子介绍了输入多个字符串的情况
- 思考:如果要输入的字符串里面包含空格怎么办呢?
string变量输入一行
#include<iostream>
#include<string>
using namespace std;
int main(){
string food;//食物
cout << "你最喜欢的食物有哪些呀?" << endl;
//读取一行
//从标准输入设备(cin)读取一行,读取一行字符串,保存到food中
//读一行,直到遇到回车符,不包括回车符
//如果用户直接输入回车,就没有任何数据输入。
getline(cin, food);
//判断语句,括号中的结果为true就执行,否者执行else中的语句。
//food.empty()判断字符串是否为空字符串,如果是就返回true
if(food.empty() == true){
cout << "你啥都没输入呢" << endl;
}else{
cout << "太巧了,我也喜欢吃" << food << endl;
}
//string常用函数
//计算字符串的长度 length(); 和 size()
cout << "food的长度为:" << food.length() << endl;
cout << "food的长度为:" << food.size() << endl;
return 0;
}
和上一节输入相同的字符串: 苹果 香蕉 草莓 面包 米饭
输出结果:
你最喜欢的食物有哪些呀?
苹果 香蕉 草莓 面包 米饭
太巧了,我也喜欢吃苹果 香蕉 草莓 面包 米饭
food的长度为:24
food的长度为:24
- 分析:使用
getline(cin, food)
将苹果 香蕉 草莓 面包 米饭读入food
中。
最后由food.length()
或者food.size()
计算出字符串长度。
长度分析:(此处)一个汉字两个字节,一个空格符一个字节,一共10个汉字,4个空格
string字符串的比较
-
比较规则:和C语言相同。
从第一个字符开始,对应字符逐个比较,直到遇到不相等的字符为止。 -
比较运算符:
> >=(无空格) < <=(无空格) ==(无空格))
-
比较的结果: 逻辑真(非0), 逻辑假(0)
例如:
“123” < “1230” 真
“19” > “123456789” 真
“2” > “1999” 真
“123” == “123” 真
“123” == “1230” 假 -
分析:(容易搞错)
第一个"123" < "1230"
: 第一个字符相同,第二个字符相同,第三个字符相同都跳过,第四个字符前面字符串为 ‘\0’ ,后面字符串为0值不相等(ASCII值不等)进行比较,0的ASCII值大于 ‘\0’ 的ASCII值,所以返回真。
第二个“19” > “123456789”
: 第一个字符相同,第二个字符不同进行比较,'9' > '2'
为真,返回真。
第三个"2" > "1999"
:第一个字符不同,进行比较,'2' > '1'
返回真。
第四个"123" == "123"
:每个字符都相同,返回真。
第五个“123” == “1230”
: 与第一个类似,0
的ASCII不等于'\0'
的ASCII值。返回假。
string字符串的加法
- 规则:把+号左侧的字符串和+号右边的字符串直接拼接成新的字符串。(C语言中字符串不支持该方式)
- 注意: 与数学中的”加法“不同。
例如:“12” + ”12“ = ”24“
”12“ + ”12“ = ”1212“
C语言字符串简介
- 在C语言中, 字符串是以"字符数组"(下节介绍)储存的。不需要加头文件string。注:使用
scanf()
或printf()
需要包含头文件stdio.h
例如:char name[32];
scanf("%s", name);//C语言的格式化输入语句
printf("%s", name);//C语言的格式化输出语句
#include<stdio.h>
#include<iostream>
int main(){
char name[32];
printf("请输入姓名:\n");
scanf("%s", name);
//也可以用C++的标准输入
std::cout << "请输入姓名" << endl;
std::cin >> name;
}
本节介绍了字符串的概念和用法,很重要。下节我们介绍数组(关键)。