CPP數組與字符串

數組

一維數組

數組是同一類型的一組值(10個 char 或15個 int) ,在內存中順序存放
整個數組共用一個名字,其中的每一項稱爲一個元素。

定義方式

類型 數組名[常量表達式]
int a[5];

C++不允許對數組的大小作動態的定義,即數組的大小不能是變量,必須是常量。
動態分配內存要new在堆內存中分配。

  • 對數組中的一部分元素列舉初值,未賦值的部分是0
int a[5] = {1,2,3};
相當於
int a[5] = {1,2,3,0,0};
  • 局部static 或全局定義的數組不賦初值時(即存儲在靜態數據區中的數組其元素默認爲0),系統均默認其爲0或’\0’。
    否則,值就是不確定的。

二維數組的定義

定義方式

類型名 數組名[常量表達式1][常量表達式2]

在內存中,多維數組依然是線性順序排列的,在內存中先順序存放第一行的元素,再存放第二行的元素。第一個元素位於最低地址處。
在這裏插入圖片描述
在這裏插入圖片描述

二維數組的初始化:
1.分行賦值

int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

2.順序賦值

int a[3][3] = {1,2,3,4,5,6,7,8,9};

3.部分賦值

int a[3][3] = {{1},{2}};
//a[0][0]=1;a[1][0]=2; 其餘元素都爲0;

分行或全部賦值時,可以省略第一維,但是第二維不可省
(一旦省了第二維參數,在內存中就不知道怎麼存儲了)

int a[][3] = {1,2,3,4,5,6,7,8,9}
//相當於a[3][3];

數組作函數參數

一、數組元素作函數實參
數組元素作函數實參,用法與一般變量作實參相同,是“值傳遞”。

二、數組名作函數參數
在C++中,數組名被認爲是數組在內存中存放的首地址,也就是數組的指針。
用數組名作函數參數,實參與形參都應該用數組名。這時,函數傳遞的是數組在內存中的地址,實參中的數組地址傳到形參中,實參形參共用同一段內存

  • 用數組名作函數參數,應在主調函數和被調函數中分別定義數組,且類型一致。

  • 需指定實參數組大小,形參數組的大小可不指定。

  • C++語言規定,數組名代表數組在內存中存儲的首地址,這樣,數組名作函數實參,實際上傳遞的是數組在內存中的首地址。實參和形參共佔一段內存單元,形參數組中的值發生變化,也相當於實參數組中的值發生變化。

void f(int a[][4]);
void f(int a[3][4]);
int a[3][4];
f(a);
f(a);

字符數組

用來存放字符數據的數組是字符數組,字符數組中的一個元素存放一個字符。

char 數組名[常量表達式];
char c[4]; //每個元素佔一個字節
  • 字符數組的初始化
char c[10] = {'h','e','l','l','o'};

如果字符個數大於數組長度,做錯誤處理;
如果字符個數小於數組長度,後面的字節全部爲‘\0’
如果字符個數等於數組長度,沒有爲’\0’留出空間,就會出現奇怪的輸出。

demo

    char c[5] = {'h','e','l','l','o'};
    char b[2] = {'a','b'};
    cout<<c<<endl;
    cout<<b<<endl;
hello
abhello
  • 字符串和字符串結束標誌
    字符串常量:“CHINA”,被處理成一個無名的一維字符數組。
    C++語言中約定用‘\0’作爲字符串的結束標誌,它佔內存空間,但不計入串長度。有了結束標誌‘\0’後,程序可以依據它判斷字符串是否結束,而不是根據定義時設定的長度。
    '\0’的ASCLL碼值爲0。
    cout<<sizeof("abc")<<endl;
    cout<<strlen("abc")<<endl;
4
3
  • 字符串與字符數組的區別
    char a[] = {'h','e','l','l','o'};
    char a1[] = "hello";  // char a1[] = {"hello"};
    cout<<sizeof(a)<<endl;
    cout<<sizeof(a1)<<endl;
char w[] = {'a','b','c','\0'};
char w[] = {"abc"};
char w[] = "abc";
//三種寫法是等價的
5
6 //多了個'\0'
  • 字符數組不能用賦值語句整體賦值。

error_demo

char str[12];
str = "string"; //error
//str爲字符數組在內存中存儲的地址,一經定義,便成爲常量,不可再賦值

demo

char str[12] = "string";
// 定義數組、開闢空間時賦初值(初始化)

但要注意這是允許的,就是因爲數組地址已經定義常量,不可賦值,但是對單個字節的的值的修改是允許的。
demo

    char c[7];
    c[0] = 's';
    c[1] = 't';
    c[2] = 'r';
    c[3] = 'i';
    c[4] = 'n';
    c[5] = 'g';
    c[6] = '\0';
    cout<<c<<endl;

字符串的輸入輸出

  • 單個字符依次輸入輸出
char str[100];
for(int i=0;i<90;i++){
	cin>>str[i];
}

for(int i=0;i<90;i++){
	cout<<str[i];
}
  • 把字符數組作爲字符串輸入輸出
    demo
char str[100];
cin>>str;
cout<<str;

但是輸入的時候遇到'\n' '\t' ' '會停止輸入。

C++標準庫中I/O類對<<操作符重載,在遇到字符型指針或字符數組名時,會將其當作字符串名來處理,輸出指針所指的字符串

  • 要把輸入的一行作爲一個字符串送到字符數組中時,需要使用函數cin.getline( )。這個函數的第一個參數爲字符數組名第二個參數爲允許輸入的最大字符個數
cin.getline(數組名,最大字符數);

char s1[101];
cin.getline(s1,100);
  1. 當輸入行中的字符個數小於101時,將實際輸入的字符串(不包括換行符)全部送給s3;
    最後一個字符爲’\0’,ASCLL碼值0.
    char c[7];
    cin.getline(c, 6);
    cout<<(int)c[6]<<endl;
123456  //(CR)
0  //  '\0'的ASCLL值
  1. 當輸入行中的字符個數大於101時,只取前面的101個字符送給字符串。
char c[101];
cin.getline(c,101);
最多接受101個字符。
  • getsputs
gets(字符數組);
從終端輸入一個字符串到字符數組,並且得到一個函數值。該函數值是字符數組的起始地址。
當輸入一行文本並按下回車鍵時,會讀取一整行直到該行結束(包括空格).
在讀取完字符串時將'\n'換成'\0'char c[100];
char *pc = gets(c);
cout<<pc<<endl; 相當於
cout<<c<<endl;
puts(字符數組);
將一個字符串(以′\0′結束的字符序列)輸出到終端。
在用puts輸出時將字符串結束標誌′\0′轉換成′\n′,即輸出完字符串後換行。
(中間的轉義字符保留)

注意:
用puts和gets函數只能輸出或輸入一個字符串。

C字符串處理函數

include <string.h>

所有字符串處理函數的實參都是字符數組名

合併函數
1.strcat(str1,str2)
注意第一個數組str1要有足夠的空間。
在這裏插入圖片描述

拷貝函數
2、strcpy(str1,str2)

在這裏插入圖片描述

非法操作demo

str1 = str2;
str1 = "notok";
strcpy("ABC",str1);

2.1
strncpy(字符數組名1, 字符串2, maxlen)
第三個參數爲正整數,它限定了至多拷貝的字符個數。

比較函數
3.strcmp(str1,str2)
比較的是字典序。
此函數用來比較str1和str2中字符串的內容。函數對字符串中的ASCII字符逐個兩兩比較,直到遇到不同字符或‘\0’爲止。函數值由兩個對應字符相減而得。

該函數的返回值是兩字符串對應的第一個不同的ASCII碼的差值.
(1)如果字符串1=字符串2,函數值爲0。
(2)如果字符串1>字符串2,函數值爲一正整數。
(3) 如果字符串1<字符串2,函數值爲一負整數
如果判斷兩個字符串相同呢?

if(strcmp(str1,str2)){
……
}

3.1
第三個參數爲正整數,它限定了至多比較的字符個數
strncmp(字符串1,字符串2 , maxlen)

求字符串長度
4.strlen(str1)
函數參數爲數組名,返回值爲數組首字母到‘\0’的長度。並非數組在內存中空間的大小。長度不包括‘\0’。

char s[100];
strcpy(s,"abc");
//
strlen(s)  ==  3 (沒有'\0'sizeof(s)  ==  100*1 == 1 

5.strlwr(str1)
將str1中的大寫字母轉換成小寫字母。

6strupr(str1)
將str1中的小寫字母轉換成大寫字母。

c++的字符串類與字符串變量

#include <string>

string並不是C++語言的基本類型,它是在C++標準庫中聲明的一個字符串類,用這種類可以定義對象。每一個字符串變量都是string類的一個對象 。

  • 處理字符串長度
string s;
s.size();
s.length();
  • 賦值
    (直接像普通變量賦值就可)
string s1 = "sss";
string s2; 
s1 = s2;
  • IO
string s;
cin>>s;
cout<<s;
  • 字符串拼接
    +操作符(重載過了)
string s1 = "hello";
string s2 = " world";
string s3 = s1+s2;
  • 比較關係操作符
    直接使用
==  >  < <= >= 等等
  • 總結
    string s="abcd";
    cout<<s.length()<<endl; // 4
    cout<<s.size()<<endl;   // 4   string 類內部封裝好,對外不需要'\0'
    
    char ca[5] = {'a','b','c','d'};
    cout<<strlen(ca)<<endl; // 4
    cout<<sizeof(ca)<<endl; // 5  後面的都是'\0'
    
    char c[] = "abcd";
    cout<<strlen(c)<<endl;  //  4
    cout<<sizeof(c)<<endl;  //  5  補了個'\0'
    
    const char *pc = "abcd";
    cout<<strlen(pc)<<endl;  // 4
    cout<<sizeof(pc)<<endl;  // 8         64位機器 指針的大小是8個字節。

C++對字符串的處理有兩種方法:

一種是用字符數組的方法,這是C語言採取的方法, 一般稱爲C string方法;

一種是用string類定義字符串變量,稱爲string方法。
string方法概念清楚,使用方便,最好採用這種方法。但是比較慢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章