《c++入門經典》筆記7

《c++入門經典》筆記7

第七章 使用數組和字符串存儲信息

7.1數組是什麼

數組是一系列類型相同的相關數據。可將數組視爲一系列數據存儲單元,其中每一個存儲單元都是數組的一個元素。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;
}

7.2寫入時超過數組末尾

數組越界沒啥好說的,略post

7.3初始化數組

例如:編碼

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};//容許

7.4多維數組

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};

7.5字符數組

在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'字符。

7.6複製字符串

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;
}

7.7使用foreach循環讀取數組

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;
}

相關文章
相關標籤/搜索