
一个变量存一个值。要存 100 个数怎么办用数组。要存一段文字用字符串。本章讲如何存储一组数据和文字。7.1 什么是数组数组array是一块连续内存存放相同类型的多个元素通过下标访问。intscores[5];// 声明一个能装 5 个 int 的数组scores[0]90;// 给第 0 个元素赋值scores[1]85;scores[2]78;scores[3]92;scores[4]88;也可以声明时就初始化intscores[5]{90,85,78,92,88};intprimes[]{2,3,5,7,11};// 大小可省略自动推导为 5访问元素下标从 0 开始数组下标从 0 开始这是新手最常犯错的地方inta[3]{10,20,30};std::couta[0];// 10第一个元素std::couta[1];// 20第二个std::couta[2];// 30第三个// a[3] 不存在访问它属于越界是危险的错误遍历数组数组和循环是绝配intsum0;for(inti0;i5;i){sumscores[i];// 依次累加每个元素}std::cout总分sumstd::endl;注意C 风格数组int a[5]不会记住自己的大小你得自己数。这也是它不如std::vector第 12 章好用的原因之一。7.2 二维数组数组的元素还可以是数组形成二维数组矩阵intmatrix[2][3]{{1,2,3},{4,5,6}};std::coutmatrix[0][1];// 2第 0 行第 1 列二维数组用两个下标matrix[行][列]。看到二维数组你就该想到 Eigen 的矩阵了——MatrixXd本质上就是功能更强大的二维数组。7.3 C 风格字符串C 里表示文字有两种方式先看老的C 风格字符串是一个char数组末尾有一个特殊的\0空字符标记结束charname[]hello;// 实际是 {h,e,l,l,o,\0}共 6 个字符C 风格字符串不好用要自己管理大小、容易越界现代 C 基本都用std::string。7.4 std::string现代字符串std::string是 C 标准库提供的字符串类型好用得多#includestring#includeiostreamintmain(){std::string nameAlice;// 声明字符串std::string fullname Smith;// 用 拼接std::coutfullstd::endl;// Alice Smithstd::cout长度full.size()std::endl;// 11// 取单个字符下标从 0 开始std::coutfull[0]std::endl;// A// 判断相等if(nameAlice){std::cout名字是 Alicestd::endl;}return0;}常用操作操作例子说明拼接s1 s2连接两个字符串长度s.size()字符个数取字符s[i]第 i 个字符比较s1 s2是否相等查找s.find(x)查找子串位置截取s.substr(0, 3)取前 3 个字符std::string shello world;std::couts.find(world)std::endl;// 6world 的起始位置std::couts.substr(0,5)std::endl;// hello7.5 从键盘读入数据之前我们都是直接赋值现在学习输入——用std::cin#includeiostream#includestringintmain(){std::string name;intage0;// 一上来就赋 0别让它带着垃圾值出场std::cout请输入你的名字;std::cinname;// 读入一个字符串遇到空格停止std::cout请输入年龄;std::cinage;// 读入一个整数std::coutname 今年 age 岁std::endl;return0;}std::cin 变量从键盘读入存进变量。和cout的方向相反数据从键盘流进变量。为什么int age 0;要写这个 0如果你输入的不是数字比如手滑敲了个x或者输入流直接结束std::cin会读取失败、age保持原值。不初始化时这个原值是内存里碰到的随机东西——实测同一段程序读取失败时打印过今年 169 岁另一次跑输入被重定向成空打印过今年 32762 岁每次都可能不一样。改成int age 0;之后同样情况下老实打印今年 0 岁一眼就知道是输入没成功。变量声明就初始化是 C 的基本纪律本书后面的例子都遵守它。运行程序会停下来等你敲键盘。依次输入Alice回车、20回车请输入你的名字Alice 请输入年龄20 Alice 今年 20 岁前两行里Alice、20是你输入时被屏幕显示回来的请输入...才是程序打印的。最后一行是结果。要读含空格的一整行用std::getlinestd::string line;std::getline(std::cin,line);// 读一整行含空格7.6 完整示例求平均分#includeiostreamintmain(){doublescores[5]{0};// 整数组初值全给 0见 7.5 的声明就初始化纪律doublesum0;// 读入 5 个分数for(inti0;i5;i){std::cout请输入第 i1 个分数;std::cinscores[i];sumscores[i];}std::cout平均分 sum/5std::endl;return0;}运行程序会连着问你五次分数依次输入9080706050每输入一个按一次回车请输入第 1 个分数90 请输入第 2 个分数80 请输入第 3 个分数70 请输入第 4 个分数60 请输入第 5 个分数50 平均分 709050是你敲进去的程序自己的输出只有五句提示和最后的平均分 70。7.7 小结数组同类型元素的连续存储下标从 0 开始。二维数组a[行][列]就是矩阵。std::string现代字符串支持拼接、.size()、[]取字符。std::cin读入std::cout输出。下一章进入 C 最核心也最难的部分——指针与引用。理解它你才真正入门 C。练习题声明数组存 5 个成绩用循环求最大值和最小值。用二维数组存一个 3x3 的矩阵求对角线元素之和。用std::string拼接你的姓和名打印长度。从键盘读入两个整数输出它们的和、差、积。读入一个字符串把它倒序打印提示从末尾往前遍历。