Part 1
Working with strings使用字符串
Review 上节课内容回顾
在第0部份通过解析小程序,我门学习了C++的基本概念:
注释、标准头文件、作用域、表达式、语句、字符串直接量、输出。
注释
v “//”单行注释符,多用于较短注释,为程序员优先采用
v “/*”开始,“*/”结束,连续多行注释或处理不想编译的程序代码
v c(console)out.
头文件
v header 头文件:两种
v standard header 标准头文件,如已学的iostream.h、string.h,其格式为:
#include <文件名.扩展名>
v 用户自定义(编写)的头文件,文件名用用双引号括起,其格式为:
#include “文件名.扩展名”
在这一部分,继续学习基本概念,通过使用字符串编写简单程序,学习声明、初始化变量,进一步了解输入和string库。
本部分内容安排
1. Input 输入
2. Framing a name 为姓名装框
3. Details 小结
1. Input 输入
请阅读以下修改版的 “Hello”程序
// ask for a person's name, and greet the person
#include <iostream>
#include <string>
int main()
{
// ask for the person‘s name 请输入你的名字
std::cout << "Please enter your first name: ";
// read the name 读名字
std::string name; // define name
std::cin >> name; // read into
// write a greeting 写贺语
std::cout << "Hello, " << name << "!" << std::endl;
return 0;
}
此程序运行时
屏幕显示:
Please enter your first name:
输入以下名字作为响应:
Kitty
程序将会输出:
Hello, Kitty!
程序解析 1
// ask for a person's name, and greet the person
#include <iostream>
#include <string>
int main()
{
// ask for the person‘s name 请输入你的名字
std::cout << "Please enter your first name: ";
// read the name 读名字
std::string name; // define name
std::cin >> name; // read into
// write a greeting 写贺语
std::cout << "Hello, " << name << "!" << std::endl;
return 0;
}
解析:name 变量variable,是具有名称的对象object
为读入输入,找个存放地方
std::string name;
“std”表示标准库;string表示类型;name表示变量
Name:变量
Ø 变量:一个具有名称的对象
Ø 对象:计算机中一段具有类型的内存空间
Ø 有些对象没有名称
Object, Name & Variable
An Object 不一定有 Name
Variable 一定有 Name
A Variable 是个有 Name的Object
v 变量name类型是std::string,使用字符串
string是标准库一部分,
std::string 相关头文件是<string>
v 定义在一个函数体内(在一对花括号内),是局部变量
v 局部变量仅存活在花括号括起的程序运行期内
v 程序运行至 “}”,变量被销毁、变量所占内存释放
v 局部变量有限的生存期是区分变量和对象的一个重要依据
定义变量方法
定义一个名为name的string变量(具名对象)
后,能够对变量name做库允许的所有操作
格式:
数据类型 变量名;
或
数据类型 变量名,变量名,…,变量名;
如: char C; //定义字符变量 C
int i,j; //定义整型变量i, j
float x,y,z, //定义实型变量
A bit extra…
整数类型int的值是指在
-32 768 到 32 767
范围之内的整数值。
程序解析 2
// ask for a person's name, and greet the person
#include <iostream>
#include <string>
int main()
{
// ask for the person‘s name 请输入你的名字
std::cout << "Please enter your first name: ";
// read the name 读名字
std::string name; // define name 定义变量
std::cin >> name; // read into “读取到变量name中、、、“
// write a greeting 写贺语
std::cout << "Hello, " << name << "!" << std::endl;
return 0;
}
初始化 Initialize
std::cin >> name; //把名字读进name
v 标准库要求每一个string对象都要有一个初始化值
v 在定义一个变量时,对它进行隐式初始化
v 在创建一个字符串时,
可对它赋明确值
若未赋值,则为空字符串(不包含任何字符)
v 一个字符串还可以通过直接给它一串字符或另一个字符串变量来初始化:
std::string othername = " Kitty ";
std::string name = othername;
语句分析-输入
std::cin >> name; //把名字读进name
库使用 >>运算符&std::cin 进行输入
把std::cin中输入的值读入变量name中
v 用库读字符串:
首先略去输入开始时碰到的whitespace空白字符(space空白, tab, backspace, or the end of the line)
然后连续地读字符到name变量中
直至whitespace空白字符或文件结束标记为止
v 表达式执行结果:读输入词(字符串),再存储到变量name中
程序解析 3
// ask for a person's name, and greet the person
#include <iostream>
#include <string>
int main()
{
// ask for the person‘s name 请输入你的名字
std::cout << "Please enter your first name: ";
// read the name 读名字
std::string name; // define name 定义变量
std::cin >> name; // read into
// write a greeting 写贺语
std::cout << "Hello, " << name << "!" << std::endl;
return 0;
}
语句分析-输出
std::cout << "Hello, " << name << "!" << std::endl;
1. 输出字符串直接量“Hello,”
2. 输出字符串变量name的值
3. 对std::endl的值写操作,结束输出行
4. 刷新缓冲区buffer
5. 系统立即向输出流写入数据
刷新缓冲区flashes the buffer
库使用缓冲区buffer来积累待写的字符,这样,他就能把几个输出操作合并到一个单独的写操作中了。endl 有刷新缓冲区作用。
2. Framing a name 为姓名装框
输出分析
程序有五行长度相同的输出,各行组成:
v 1st & 5th line:框架开始,一串 * 字符组成;其长度跟3rd line:名字、问候(Hello)、两端空格、两端各一个 * 字符
v 2nd & 4th line:头尾两端各一个 * 字符、适量空格
v 3rd line:头尾两端各一个 * 字符、空格,中间greeting 信息
Part 1 Pragram
1.1 输入
// ask for a person's name, and greet the person
#include <iostream>
#include <string>
int main()
{
// ask for the person's name 请输入你的名字
std::cout << "Please enter your first name: ";
// read the name 读名字
std::string name; // define name
std::cin >> name; // read into
// write a greeting 写贺语
std::cout << "Hello, " << name << "!" << std::endl;
return 0;
}
1.2 为姓名装框
// ask for a person's name, and generate a framed greeting
#include <iostream>
#include <string>
int main()
{
std::cout << "Please enter your first name: ";
std::string name;
std::cin >> name;
// 第3行,输出的问候语
const std::string greeting = "Hello, " + name + "!"; A
//第2&4行,输出的空白为主
const std::string spaces(greeting.size(), ' ');
const std::string second = "* " + spaces + " *";B
//第1&5行,输出一连串 *
const std::string first(second.size(), '*'); C
// write it all 输出所有内容
std::cout << std::endl;
std::cout << first << std::endl;
std::cout << second << std::endl;
std::cout << "* " << greeting << " *" << std::endl; D
std::cout << second << std::endl;
std::cout << first << std::endl;
return 0;
}
程序A部分解析
// 3rd line, 输出问候语
const std::string greeting = "Hello, " + name + "!";
const 把变量定义成常量
用“=“符号给变量赋值
用“+“符号连接字符串直接变量
注意:若变量是常量,需在定义时初始化。
在此用 “=” 初始化。
若输入“Kitty”, 以上语句的输出将为:
Hello, Kitty!
程序B部分表达式1解析
const std::string spaces(greeting.size(), ' ');
greeting 为对象;size()为成员 “' '“
greeting.size()调用成员函数
v greeting.size(): 对象greeting有一个成员size
成员size是个函数;
v A部分已定义greeting为std::string类型;
v greeting包含的字符个数,即对greeting.size()求值产生的整数
v 字符直接量表示一个字符,由单括号括起
理解 std::string spaces(greeting.size(), ' ');
v 如果有定义:std::string stars (10, ‘*’);
stars.size()的结果是10,即字符串stars的长度
stars 本身包括10个 * 字符,即**********
*********************
* *
* Hello, Kitty! *
* *
*********************
第3行,greeting(不包括两端 ‘*’)
第2&4行, spaces(不包括两端 ‘*’)
v 故 spaces = greeting 字符个数
且字符都为空白,即 ‘ ’
const std::string second = "* " + spaces + " *";
second : “*”、空白字符串、“*”
这就是第2 & 4 行的输出
3. Details小结
1) string类型
v 定义于标准头文件<string>中
v 一个string类型的object对象包含一连串(0或多个)字符
char & string 类型
v char 类型表示一个字符,用单引号 ‘ ’括起;
v string 类型表示一串字符,用双引号 “ ”括起
string类型数据操作
假如变量及类型为:n:整数,c:char类型
对string类型数据操作包括:
std::string s; 把s定义为类型为std::string、初始为空的变量。
std::string t=s; 把t定义为类型为std::string的变量,其初始值包含字符同s; s可为一个字符串或字符串直接量。
std::string z(n,c); 定义变量z为std::string类型,其初始化为包含n个字符c的字符串。c必须是一个字符,不能是字符串或字符串直接量。
s+t 此表达式结果为std::string 类型,包含的字符串前半部为s中所有字符,后半部为t中所有字符。
s.size() 表示s包含的字符个数。
2) 程序中变量定义的3种形式
1. 用明确的初始化值来定义变量:
std::string hello=“Hello”;
2. 根据类型和给定的表达式来构造一个变量:
std::string stars(100, ‘*’);
3. 定义一个变量,定义是不明确制订它的初始化值。此变量的初始化值取决于它的类型。
std::string name;
3)输入
执行std::cin>>v 表达式会忽略任何在标准输入流中的空白字符,然后从标准输入把数据读入到变量v中。
这个表达式会返回类型为istream的std::cin,这样,我们就可以进行链式的输入操作。