字元串簡介
定義
字元串或串(String)是由數字、字母、下劃線組成的一串字元。一般記為 s=“a1a2···an”(n>=0)。它是程式語言中表示文本的數據類型。在程式設計中,字元串(string)為符號或數值的一個連續序列,如符號串(一串字元)或二進制數字串(一串二進制數字)。
通常以串的整體作為操作對象,如:在串中查找某個子串、求取一個子串、在串的某個位置上插入一個子串以及刪除一個子串等。兩個字元串相等的充要條件是:長度相等,並且各個對應位置上的字元都相等。設p、q是兩個串,求q在p中首次出現的位置的運算叫做
模式匹配。串的兩種最基本的存儲方式是順序存儲方式和連結存儲方式。
表示方式
正確定義:
char[]={‘c’,’c’,’c’};或char[4]={‘c’,’c’,’c’};
需要注意下列問題:
1.char[]={“cc”};
如果使用這種定義方法,則數組長度必須大於字元串的長度,至少大1。當然也可以不指定數組長度;
例如:
char[3]={“str”}
char[3]=”ccc”;
以上這兩種,錯誤定義,系統會報錯,字元溢出。
2.char[3]={‘c’,’c’,’c’};
這種定義方法,系統不會報錯,但最後的輸出會出現亂碼。
常用函式
字元串輸入函式:
函式
| 格式
| 功能
|
gets() | gets(字元數組) | 從鍵盤輸入一以回車結束的字元串放入字元數組中, 並自動加'\0' |
scanf() | scanf("%s", 字元數組) | 從鍵盤輸入一以空格或回車結束的字元串放入字元數 組中,並自動加'\0' |
字元串輸出函式
函式
| 格式
| 功能
|
puts() | puts(字元串地址) | 向顯示器輸出字元串(輸出完,換行) |
printf() | printf("%s", 字元串地址) | 依次輸出字元串中的每個字元直到遇到字元'\0'('\0'不會被輸出) |
字元串的長度
函式
| 格式
| 功能
|
strlen() | strlen(字元串地址) | 計算字元串長度,返回字元串實際長度,不包括'\0'在內 |
字元串的複製
函式
| 格式
| 功能
|
strcpy () | strcpy (字元數組1,字元串2) | 將字元串2拷貝到字元數組1中去,返回字元數組1的首地址 |
strncpy () | strncpy (字元數組1, 字元串2, 長度n) | 將字元串1前n個字元的子串與字元串2前n個字元的子串進行比較
|
字元串的比較
函式
| 格式
| 功能
|
strcmp () | strcmp (字元串1, 字元串2) | 比較兩個字元串,對兩串從左向右逐個字元比較(ASCII碼),直到遇到不同字元或'\0'為止 |
stricmp() | stricmp(字元串1, 字元串2) | 同strcmp,stricmp在比較兩個字元串時不區分大小寫,而strcmp則區分大小寫 |
strncmp () | strncmp (字元串1, 字元串2, 長度n) | 將字元串1前n個字元的子串與字元串2前n個字元的子串進行比較 |
上述為幾種常見的字元串的函式。
字元串賦值方式
C語言中,字元串的表現形式有兩種:一種是以字元數組的形式,如char str[20]="I love china";另一種是以字元指針的形式,如char *str="I love china"。字元串可以賦值給字元指針變數,或者將字元串用字元數組保存。因為c語言沒有直接對字元串提供語法糖方面的支持。而且C標準庫很多方法處理字元串是以空字元結尾為前提的,這個必須要記住。
char *p,a='5';p=&a; //顯然是正確的,p="abcd"; //但為什麼也可以這樣賦值??
在如上程式中,雙引號做了3件事:申請了空間(在常量區),存放了字元串 ;在字元串尾加上了’/0’ ;返回地址。這裡就是把返回的地址賦值給了p。
但是char *p = “hello”;表達式為什麼可以,而把p換成數組,然後再賦值就不行了。這是因為字元串常量”hello”出現在一個表達式中時,”hello”表達式使用的值就是這些字元所存儲的地址(在常量區),而不是這些字元本身。所以,可以把字元串賦值給指向字元的指針p,而不能把字元串賦值給一個字元數組。char a[10] = “hello”; 這樣也是可以的,這種情況是c語言初始化所支持的。如果寫成char a[10]然後 a = “hello” 這樣就錯誤了。同樣是a數組,char a[10] = “hello”;這種是數組的初始化,和a[0] = ‘h’ a[1] = ‘e’…是一個道理。但是換成char a [10],然後a = “hello”就不行了 “hello”賦值的值是一個地址,而a雖然也有地址,但是這與指針是不一樣的,指針的值是地址,而數組的值雖然也是地址,但是卻是一個常量,所以不能給常量賦值。
我們來測試一下:
#include <stdio.h> int main(){ char *p = "hello"; printf("%s",p); char a[10]; a = "hello"; return 0;}error C2440: '=' : cannot convert from 'char [6]' to 'char [10]' There is no context in which this conversion is possible
看到這樣的錯誤提示,試一下把char a[10]改成char a[6]
error C2106: ‘=’ : left operand must be l-value
運算符的左邊應該是一個“左值”。所謂“左值”就是指在程式中占用記憶體空間、可以被修改的量,比如各種變數。
在使用指針的時候,指針可以自增,而數組名不能自增編譯器給數組分配了空間,數組a的地址就表示一個常量了,讓常量自增這肯定是不行的。
同時,在指針自增的時候,編譯器會自動識別類型,比如指針是指向int型的,想獲取下一個的地址時,指針直接p++就行了,不要多此一舉的p+4了。
需要注意的是,在void指針使用的時候,不能使用指針運算,因為void型編譯器不能識別類型的長度(即指針所指對象的體積),p++這樣就是不合法的,即不能進行數學運算,也不能使用*取值操作,想使用必須轉換為其它的類型。