HOUR 7 Storing Information in Arrays and Strings

本文详细介绍了数组的概念及使用方法,包括一维和多维数组的初始化、元素的读取和复制,以及字符数组的处理技巧。

什么是Array?

Array 就是一组相似的数据集合,每个数据叫做element。

Tricky

  • 要注意十个元素的array计数从a[0]到a[9], not a[1] 到 a[10]
  • 写入out-of-bound的数据时,编译器不检查是否越界,直接硬写,从首地址偏移相应的字节数后,在内存中写入新数据,这可能造成程序崩溃,如果你写入的地方恰好是关键变量的话。

Initializing Arrays

Omit the siaze of the array

—just big enough to hold the initialization is created:

int post[] = {10, 20, 30,  40, 50};

创建了五个元素的array

计算元素数量:

const int size = size(post)/size(post[0]);

 

Initialize an array with fewer elements than it holds

int long[5] = { 10, 20};

其余值默认为0

Multidimentional Arrays

一维array理解为一行元素

二维array可用下图理解

image

初始化的方法

通常,为了清晰明了,使用以下方法初始化

int box[5][3] = {
     {5, 3, 6},
     {8, 6, 7},
     {2, 7, 11},
     {55, 33, 22},
     {43, 3, 5}
};

这与

int box[5][3] = { 5, 3, 6, 8, 6, 7, 2, 7, 11, 55, 33, 22, 43, 3, 5};

本质上是一样的,内部的花括号编译器会忽略掉。

 

Character Arrays

String 本质是一个array, 结尾是 null, null就是’\0’

两种方法初始化 character array

  • char yum[] = { ‘Z’, ‘ ’, ‘E’, ‘a’, ‘t’, ‘ ‘, ‘B’, ‘r’, ‘a’, ‘i’, ‘n’, ‘s’, ‘\n’};
  • char yum[] = “Z Eat Brains”;

两种方法等效,后者自动在末尾添加 null

还有一种不初始化的方法,buffer

std::cin >> yum;

这种方法有两个潜在危害

  • 用户输入字符数超过buffer范围
  • 用户如果输入 space, cin会认为输入完毕

解决这个问题的方法是使用cin的getline()函数,两个变量

  • buffer
  • 最大字符数

std::cin.getline(yum, 18); 这允许用户输入18个字符(包括null)

此函数还可以有第三个参数:终止符

std::cin.getline(yum, 18, ‘ ‘);

当用户输入第一个空格时,输入被认为结束,如果省略第三个参数,则认为用户输入换行符’\n’结束输入

当用户输入超过规定的字符数时,超出部分不予录入。

char name[10];
cout << "input your name" << endl;
cin.getline(name, 9);
cout << "U entered " << name << endl;

注意如果空间是10个字符,getline中必须是9个字符,最后一个预留来放null

Copying String

C++继承了C的库,复制String时可以 include <string.h>

strcpy(tarStr1, srcStr);此函数风险是array越界,越界后什么样子呢,见下图

image

strncopy(tarStr1, srcStr, 80); 此函数第三参数限定了max characters to copy

Reading Arrays with Foreach Loops

C++提供了一种遍历array元素的方法, for, 这个for循环用冒号分隔,而不是分号

talk is cheap show you code

#include <iostream>

int main()
{
     int production[] = {3333, 5555, 3333, 7777};

    for(int year : production)
     {
         std::cout << "Output: " << year << std::endl;
     }
     return 0;
}

这个是C++14新功能,编译时要添加std = c++14 懒得弄了,感觉学下面的吧,有时间可以参考一下这个连接https://stackoverflow.com/questions/31171979/enabling-std-c14-flag-in-codeblocks

Q.未初始化的array里面存的什么数?

A.declare一个array后,会在内存中申请一片空间,所以未初始化的元素的值,就是原来内存中的值,测试一下如下图

image

转载于:https://www.cnblogs.com/a-cock/p/8570395.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值