數組是一系列類型相同的相關數據。可將數組視爲一系列數據存儲單元,其中每一個存儲單元都是數組的一個元素。ios
要聲明數組,可依次指定數據類型、數組名以及用方括號括起的元素數,以下所示:c++
long peaks[25];
數組數組元素從0開始編號,直到n-1(n爲數組長度)安全
程序清單7.1 WeightGoals.cpp函數
#include <iostream> int main() { float goal[4]; goal[0]=0.9; goal[1]=0.75; goal[2]=0.5; goal[3]=0.25; float weight,target; std::cout<<"Enter current weight: "; std::cin>>weight; std::cout<<"Enter goal weight: "; std::cin>>target; std::cout<<std::endl; for (int i = 0; i < 4; i++) { float loss = (weight - target) * goal[i]; std::cout<<"Goal "<<i<<": "; std::cout<<target+loss<<std::endl; } return 0; }
數組越界沒啥好說的,略post
例如:編碼
int post[10] = {0,10,20,30,40,50,60,70,80,90};
若是省略長度,它包含的元素數將等於初始值數。code
int post[] = {0,10,20,30,40,50,60,70,80,90};//10
獲取數組元素,最經常使用的使用sizeof()對象
const int size = sizeof(post) / sizeof(post[0]);
初始化的元素數量不能超過聲明的長度,好比:blog
int array[3] = {1,2,3,4};//編譯器報錯 int arr[3] = {1,2};//容許
n維數組是n-1維數組的堆疊
好比:
int board[8][8];//二維數組
就是八個長度爲8的一維數組的堆疊,因此也能夠用如下方法存儲這些數據:
int board[64];
初始化多維數組:
程序清單7.2 Box.cpp
#include <iostream> int main() { int box[5][3] = { {8, 6, 7}, {5, 3, 0}, {9, 2, 1}, {7, 8, 9}, {0, 5, 2}}; for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { std::cout<<"box["<<i<<"]"; std::cout<<"["<<j<<"] = "; std::cout<<box[i][j]<<"\n"; } } return 0; }
也可各維元素放在一塊兒,可是會比較難看:
int box[5][3] = {8, 6, 7,5, 3, 0,9, 2, 1,7, 8, 9,0, 5, 2};
在c++中,字符串是以空字符結尾的字符數組,空字符是以編碼爲'\0'的特殊字符。可像其餘數組那樣聲明並初始化字符串
char yum[] = {'Z','0','m','b','i','e',' ','E','a','t',' ','B','r','a','i','n','s','\0'};最後的'\0'是用於結束字符串的空字符
這種逐個字符輸入的方法比較困難,很容易出錯,c++提供了使用字面量初始化字符串的簡捷方式:
char yum[] = "Zombie Eat Brains";這種初始化方法不須要使用空字符,而是由編譯器自動添加的。
字符串"Zombie Eat Brains"佔用18個字節(包括空字符)
也可建立未初始化的字符數組,這被稱爲緩衝區。
緩衝區可用於存儲用戶輸入,雖然
std::cin>>yum;
能夠將輸入存儲到變量中,可是若是用戶輸入的字符數超過了緩衝區的長度,cin寫入時將跨過緩衝區邊界,致使程序不能正確運行,更可能致使安全問題。其次,若是用戶輸入了空格,cin將認爲字符串就此結束,再也不將接下來的內容寫入緩衝區。爲解決這些問題,必須調用cin對象的getline()函數,並提供兩個參數:
- 要填充的緩衝區
- 最多讀取的字符數
下面的語句就是將用戶輸入中最多18個字符(包括空格)讀取,將其存儲到字符數組yum中:
std::cin.getline(yum,18);調用這個方法時,還可提供第三個參數——終止輸入的分隔符:
std::cin.getline(yum,18,' ');這條語句在遇到空格以後中止讀取輸入。若是省略了第三個參數,則將換行符'\n'做爲分隔符
程序清單7.3 BridgeKeeper.cpp
#include<iostream> int main() { char name[50]; char quest[80]; char velocity[80]; std::cout<<"\nWhat is your name? "; std::cin.getline(name,49); std::cout<<"\nWhat is your quest? "; std::cin.getline(quest,79); std::cout<<"\nWhat is the velocity of an unladen swallow? "; std::cin.getline(velocity,79); std::cout<<"\nName:"<<name<<std::endl; std::cout<<"Quest:"<<quest<<std::endl; std::cout<<"Velocity:"<<velocity<<std::endl; return 0; }
運行以下:
這三個問題來自電影《巨蟒與聖盃》。
爲何在輸入時輸入的字符數比數組長度小1呢?這是由於須要預留(至少是最後那一個)位置給表示字符串終止的'\0'字符。
string.h是專門用以處理字符串的函數庫
頭文件添加它的兩種辦法就是#include<cstring>
或者#include<string.h>
這個庫裏面有兩個用於將一個字符串複製到另外一個字符串的函數,一個是strcpy(),另外一個是strncpy()
strcpy與strncpy的區別:
strcpy是將整個數組複製到指定緩衝區(也就是另外一個數組),可是這樣可能會致使寫入時超過緩衝區的邊界。
strcpy_s(strings2,string1)//將整個s1複製到s2,strcpy_s是strcpy的安全版本函數,若是不用這個也能夠,但有的編譯器會警告或報錯,好比vc++
strncpy接受第三個參數,指定最多複製多少個字符:
strncopy(string1,string2,80);
程序清單7.4 StringCopier.cpp
#include <iostream> #include <cstring> int main() { char string1[] = "Free the bound periodicals!"; char string2[80]; char string3[20]; strcpy(string2, string1); std::cout << "String1: " << string1 << std::endl; std::cout << "String2: " << string2 << std::endl; strncpy(string3,string1,19); std::cout << "String1: " << string1 << std::endl; std::cout << "String3: " << string3 << std::endl; }
c++新增了一種用於遍歷數組元素的for循環,這種for循環一般被稱爲foreach循環,由於它對每一個與那蘇都執行循環一次
程序清單7.5 Production.cpp
#include <iostream> int main() { int production[]{10500, 16000, 5800, 4500, 13900}; for (int year : production) { std::cout << "Output: " << year << std::endl; } return 0; }