← 课程目录
第 4 讲 模块一:认识编程

文字也是数据

4 / 24
💡
本节课目标
今天你会用 std::string 存储文字,把多段文字拼接起来, 用 std::getline 读入带空格的整行输入,避开新手最常踩的“残留换行”坑, 最后做出一张可以让用户自己填写的个人信息卡
开场

从数字到文字

📖 理论讲解

这次轮到文字

前三节课,程序处理的都是数字:用 intdouble 存, 用 cin 读,用算术运算算。

但生活里更多数据是文字:姓名、城市、一句口号。 这节课我们就来学存文字的类型——std::string

第一段

string:存文字的容器

📖 理论讲解

声明一个 string

std::string 存文字,文字要放在双引号里。 使用前要在文件顶部加一行 #include <string>

语法和声明数字变量一样:类型 变量名 = 初始值;

Python

Python:直接写

name = "小明"

不用提前说明它是文字

VS
C++

C++:先写类型

std::string name = "小明";

要先 #include <string>

string_basic.cpp CPP
#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 之间可以用 + 拼接成一个更长的字符串。 这里的 + 不是加法,而是“首尾相连”。

concat.cpp CPP
std::string first = "陈";
std::string last  = "同学";

std::string full = first + last;          // 拼成“陈同学”
std::string hello = "你好," + full + "!";  // 文字之间也能拼

std::cout << hello << std::endl;          // 你好,陈同学!
⚠️
核心坑:数字不能直接 + 进字符串
"年龄:" + age错的——+ 只能连接文字和文字。 要么用 << 把文字和数字分开输出,要么用 std::to_string() 先把数字转成文字再拼。
number_in_string.cpp CPP
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

Python:要先转成字符串

"年龄:" + str(14)

VS
C++

C++:同理,用 to_string

"年龄:" + std::to_string(14)

⚡ 动手实操 约 12 分钟

练习:拼一句自我介绍

写一个完整程序,完成以下要求:

  1. 声明 namecity 两个 string,各自填上你的名字和城市
  2. + 拼成一句话存进新变量,比如 "我是小明,来自上海"
  3. 把这句话用 std::cout 输出
想把年龄也加进去?
试试在这句话里加上你的年龄。直接 + age 会报错—— 回到上面的“核心坑”,用 std::to_string() 或改用 <<
第三段

读文字:cin >> 的局限

📖 理论讲解

cin 也能读 string,但只读一个词

和读数字一样,std::cin >> name 可以读入文字。 但它有个重要限制:遇到空格或回车就停下,只读到第一个空格前的内容。

read_word.cpp CPP
#include <iostream>
#include <string>

int main() {
    std::string name;
    std::cout << "请输入你的名字:";
    std::cin >> name;                 // 只读到空格前!

    std::cout << "你好," << name << "!" << std::endl;
    return 0;
}
// 如果输入“张 三”,name 里只会存住“张”
⚠️
为什么名字读不全
如果用户输入 张 三(中间有空格),cin >> name 只会存住 , 空格后面的部分被留下了。要读一整行带空格的文字,就得换一个工具。
第四段

getline:读一整行

📖 理论讲解

用 getline 读整行

std::getline(std::cin, 变量) 会读入一整行, 包括中间的空格,直到用户按下回车。这正是 cin >> 做不到的。

read_line.cpp CPP
#include <iostream>
#include <string>

int main() {
    std::string fullName;
    std::cout << "请输入你的全名:";
    std::getline(std::cin, fullName); // 读一整行,空格也一起读进来

    std::cout << "你好," << fullName << "!" << std::endl;
    return 0;
}
Python

Python:input() 总是读整行

name = input("全名:")

VS
C++

C++:分两种

cin >> s → 读一个词

getline(cin, s) → 读整行

📖 理论讲解

新手必踩的坑:残留的换行

当你先用 cin >> 读了一个数字,再用 getline 读文字时, 会发现 getline 好像被“跳过”了,读到的是一个空行。

原因:cin >> age 读完数字后,用户按的那个回车(换行)还留在缓冲区里。 紧接着的 getline 一上来就读到这个换行,以为这一行已经结束了。

ignore.cpp CPP
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(); 清掉残留的换行。 现在先把它当固定写法,原理今天理解到这里就行。
⚡ 动手实操 约 15 分钟

练习:先踩坑,再修复

按顺序操作,亲眼看到这个坑,再把它填上:

  1. 写一个程序:先 cin >> 读入年龄(int),再 getline 读入全名
  2. 编译运行——你会发现还没来得及输入名字,程序就结束了
  3. 在两次读取中间加一句 std::cin.ignore();
  4. 再运行一次,这次名字能正常读进来了
💡
这就是排错的过程
看到“奇怪的行为”——找到原因——加一句修复——再验证。 你今天经历的,正是程序员每天在做的事。
第五段

实战:个人信息卡

练习 4-1

个人信息卡

写一个程序,让用户自己输入姓名、年级、爱好, 再把它们排版成一张带边框的信息卡输出。

要求:

  • 三项内容都用 std::getline 读入(这样“初一三班”这种带空格的也能读全)
  • =- 拼出上下边框
  • 每行内容前加上标签,如 姓名:

分层目标:

  • 基础版:读入并原样输出三行
  • 进阶版:加上下边框,做成卡片样式
  • 挑战版:见下一个练习

参考写法:

info_card.cpp CPP
#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 <<
存数据intdoublestd::string
算数据+ - * / %
读输入std::cin >>std::getline

也就是说,“输入 → 处理 → 输出”这个三段式,你已经能完整地走一遍了。

💡
下个模块预告
目前我们的程序都是从头跑到尾,每行都会执行。 下个模块开始,我们让程序学会做判断—— 根据不同的条件,走不同的路。比如“分数 ≥ 60 就显示及格,否则显示不及格”。