數組
一維數組
數組是同一類型的一組值(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);
- 當輸入行中的字符個數小於101時,將實際輸入的字符串(不包括換行符)全部送給s3;
最後一個字符爲’\0’,ASCLL碼值0.
char c[7];
cin.getline(c, 6);
cout<<(int)c[6]<<endl;
123456 //(CR)
0 // '\0'的ASCLL值
- 當輸入行中的字符個數大於101時,只取前面的101個字符送給字符串。
char c[101];
cin.getline(c,101);
最多接受101個字符。
gets
、puts
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方法概念清楚,使用方便,最好採用這種方法。但是比較慢。