std::string 存储文字,把多段文字拼接起来,
用 std::getline 读入带空格的整行输入,避开新手最常踩的“残留换行”坑,
最后做出一张可以让用户自己填写的个人信息卡。
std::string 存储文字,把多段文字拼接起来,
用 std::getline 读入带空格的整行输入,避开新手最常踩的“残留换行”坑,
最后做出一张可以让用户自己填写的个人信息卡。
前三节课,程序处理的都是数字:用 int 和 double 存,
用 cin 读,用算术运算算。
但生活里更多数据是文字:姓名、城市、一句口号。
这节课我们就来学存文字的类型——std::string。
用 std::string 存文字,文字要放在双引号里。
使用前要在文件顶部加一行 #include <string>。
语法和声明数字变量一样:类型 变量名 = 初始值;
Python:直接写
name = "小明"
不用提前说明它是文字
C++:先写类型
std::string name = "小明";
要先 #include <string>
#include <iostream>
#include <string>
int main() {
std::string name = "陈同学";
std::string city = "上海";
std::cout << "姓名:" << name << std::endl;
std::cout << "城市:" << city << std::endl;
return 0;
} char 存一个字符,用单引号:'A'。
这节课的 string 存一串文字,用双引号:"ABC"。
写错引号是常见报错来源。
两个 string 之间可以用 + 拼接成一个更长的字符串。
这里的 + 不是加法,而是“首尾相连”。
std::string first = "陈";
std::string last = "同学";
std::string full = first + last; // 拼成“陈同学”
std::string hello = "你好," + full + "!"; // 文字之间也能拼
std::cout << hello << std::endl; // 你好,陈同学! "年龄:" + age 是错的——+ 只能连接文字和文字。
要么用 << 把文字和数字分开输出,要么用 std::to_string()
先把数字转成文字再拼。
int age = 14;
// std::string s = "年龄:" + age; // ❌ 错!数字不能直接 + 进字符串
// 办法一:用 << 分开输出(最常用)
std::cout << "年龄:" << age << std::endl;
// 办法二:用 std::to_string 把数字转成文字再拼
std::string s = "年龄:" + std::to_string(age);
std::cout << s << std::endl; Python:要先转成字符串
"年龄:" + str(14)
C++:同理,用 to_string
"年龄:" + std::to_string(14)
写一个完整程序,完成以下要求:
name、city 两个 string,各自填上你的名字和城市+ 拼成一句话存进新变量,比如 "我是小明,来自上海"std::cout 输出+ age 会报错——
回到上面的“核心坑”,用 std::to_string() 或改用 <<。
和读数字一样,std::cin >> name 可以读入文字。
但它有个重要限制:遇到空格或回车就停下,只读到第一个空格前的内容。
#include <iostream>
#include <string>
int main() {
std::string name;
std::cout << "请输入你的名字:";
std::cin >> name; // 只读到空格前!
std::cout << "你好," << name << "!" << std::endl;
return 0;
}
// 如果输入“张 三”,name 里只会存住“张” 张 三(中间有空格),cin >> name 只会存住 张,
空格后面的部分被留下了。要读一整行带空格的文字,就得换一个工具。
std::getline(std::cin, 变量) 会读入一整行,
包括中间的空格,直到用户按下回车。这正是 cin >> 做不到的。
#include <iostream>
#include <string>
int main() {
std::string fullName;
std::cout << "请输入你的全名:";
std::getline(std::cin, fullName); // 读一整行,空格也一起读进来
std::cout << "你好," << fullName << "!" << std::endl;
return 0;
} Python:input() 总是读整行
name = input("全名:")
C++:分两种
cin >> s → 读一个词
getline(cin, s) → 读整行
当你先用 cin >> 读了一个数字,再用 getline 读文字时,
会发现 getline 好像被“跳过”了,读到的是一个空行。
原因:cin >> age 读完数字后,用户按的那个回车(换行)还留在缓冲区里。
紧接着的 getline 一上来就读到这个换行,以为这一行已经结束了。
int age;
std::string name;
std::cout << "请输入年龄:";
std::cin >> age; // 读完数字,回车(换行)还留在缓冲区里
std::cin.ignore(); // ← 关键:清掉那个残留的换行
std::cout << "请输入全名:";
std::getline(std::cin, name); // 少了上面那句,这里会直接读到空行
std::cout << name << " 今年 " << age << " 岁" << std::endl; cin >>,后面又要用 getline,
就在中间加一句 std::cin.ignore(); 清掉残留的换行。
现在先把它当固定写法,原理今天理解到这里就行。
按顺序操作,亲眼看到这个坑,再把它填上:
cin >> 读入年龄(int),再 getline 读入全名std::cin.ignore();写一个程序,让用户自己输入姓名、年级、爱好, 再把它们排版成一张带边框的信息卡输出。
要求:
std::getline 读入(这样“初一三班”这种带空格的也能读全)= 或 - 拼出上下边框姓名:分层目标:
参考写法:
#include <iostream>
#include <string>
int main() {
std::string name, grade, hobby;
std::cout << "姓名:"; std::getline(std::cin, name);
std::cout << "年级:"; std::getline(std::cin, grade);
std::cout << "爱好:"; std::getline(std::cin, hobby);
std::cout << "========================" << std::endl;
std::cout << " 姓名:" << name << std::endl;
std::cout << " 年级:" << grade << std::endl;
std::cout << " 爱好:" << hobby << std::endl;
std::cout << "========================" << std::endl;
return 0;
}
在练习 4-1 的基础上,给每一行都加上左右边框 |,做成一张完整的卡片。
getline)个人信息卡
思考:如果某一项你想用 cin >> 读数字(比如年龄),
又用 getline 读文字,中间要补哪一句?
回顾模块一这四节课,你已经掌握了一个程序最基本的骨架:
| 能力 | 用到的工具 |
|---|---|
| 输出 | std::cout << |
| 存数据 | int、double、std::string |
| 算数据 | + - * / % |
| 读输入 | std::cin >>、std::getline |
也就是说,“输入 → 处理 → 输出”这个三段式,你已经能完整地走一遍了。