C++中修改存储在数组中的数据
在前一个程序清单中,并未将用户定义的数据输入到数组中。给数组元素赋值的语法与给 int 变量赋值的语法很像。
例如,将 2016 赋给 int 变量的代码类似于下面这样:
int thisYear;
thisYear = 2016;
而将 2016 赋给第 4 个数组元素的代码类似于下面这样:
myNumbers [3] = 2016; // Assign 2016 to the fourth element
以下程序演示了如何使用常量指定数组的长度, 还演示了如何在程序执行期间给数组元素赋值:
#include <iostream>
using namespace std;
constexpr int Square(int number) { return number*number; }int main()
{const int ARRAY_LENGTH = 5;// Array of 5 integers, initialized to fiveint myNumbers [ARRAY_LENGTH] = {5, 10, 0, -101, 20};// Note - using a constexprint moreNumbers[Square(ARRAY_LENGTH)] = {25};cout << "Enter index of the element to be changed: ";int elementIndex = 0;cin >> elementIndex;cout << "Enter new value: ";int newValue = 0;cin >> newValue;myNumbers[elementIndex] = newValue;moreNumbers[elementIndex] = newValue;cout << "Element " << elementIndex << " in array myNumbers is: ";cout << myNumbers[elementIndex] << endl;cout << "Element " << elementIndex << " in array moreNumbers is: ";cout << moreNumbers[elementIndex] << endl;return 0;
}
输出:
Enter index of the element to be changed: 3
Enter new value: 101
Element 3 in array myNumbers is: 101
Element 3 in array moreNumbers is: 101
分析:
数组的长度必须是整数,为此,可使用常量来指定(如第 8 行的 ARRAY_LENGTH),也可使用常量表达式来指定(如第 12 行的 Square())。因此,数组 myNumbers 被声明为包含 5 个元素,而数组 moreNumbers 包含 25 个元素。第 14~20 行询问用户要修改哪个数组元素以及要在这个元素中存储什么样的新值。第 22 和 23 行演示了如何修改数组的特定元素,而第 26~29 行演示了如何访问数组的特定元素。请注意,修改改索引为 3 的元素时,实际修改的是第 4 个元素,因为索引从零开始,您必须习惯这一点。
注意:
数组包含 5 个 int 元素时,很多 C++新手将第 5 个值赋给索引为 5 的元素。这超出了数组的边界,因为编译后的代码将试图访问数组的第 6 个元素,这不在定义的范围内。这种错误被称为篱笆柱( fence-post)错误。之所以叫这个名字,是因为建造篱笆时,需要的篱笆柱数总是比区段(section)数多 1。
警告:
上面的程序遗漏了一些必不可少的代码:没有检查用户输入的索引是否在数组的边界内。实际上,该程序应检查 elementIndex 是否为 0~4(对于数组 myNumbers)或 0~24(对于数组 moreNumbers),如果不是,则拒绝修改数组。由于缺少这种检查,用户将被允许输入超越数组边界的值。在最糟糕的情况下,这将导致应用程序崩溃。
使用循环遍历数组元素
按顺序处理数组及其元素时,应使用循环进行遍历。
应该:
务必初始化数组,否则其元素将包含未知值。
使用数组时,务必确保在其边界内。
不应该:
在包含 N 个元素的数组中, 不要使用索引 N 来访问第 N 个元素。
别忘了,使用索引 0 来访问第一个数组元素。
该文章会更新,欢迎大家批评指正。
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器