用來存放字符的數組稱為字符數組。字符數組的各個元素依次存放字符串的各字符,字符數組的數組 名代表該數組的首地址,這為處理字符串中個別字符和引用整個字符串提供了極大的方便。
一、字符數組
字符數組的定義形式與前面介紹的數值數組相同。例如:
char c[10];
字符數組也允許在定義時進行初始化賦值。例如:
char c[6]={'c', ' h ', 'i', 'n', 'a' , '\\0' };
對字符數組的各個元素逐個賦值后,各元素的值為:
c[0]= 'c',c[1]= 'h',c[2]= 'i',c[3]= 'n',c[4]= 'a',c[5]= '\\0';
其中,‘\\0’為字符串結束符。如果不對 c[5]賦任何值,‘\\0’會由系統自動添加。
字符數組也可采用字符串常量的賦值方式,例如:
char a[]={"china"};
二、兩者的區別
1、定義不一樣
1、字符串指針變量本身是一個變量,用于存放字符串的首地址。字符串本身是存放在以該首地址為首的一塊連續的內存空間中并以‘\\0’作為串的結束。
2、字符數組是由于若干個數組元素組成的,它可用來存放整個字符串。
2、對字符串指針方式不同
1、char *ps=”C Language”;可以寫成char *ps;ps=”C Language”;
2、數組方式char st[]={”C Language”};不能寫成char st[20];
St={”C Language”};只能對字符數組的各元素逐個賦值。
字符串主要用于編程,概念說明、函數解釋、用法詳述見正文,這里補充一點:字符串在存儲上類似字符數組,所以它每一位的單個元素都是可以提取的。
如s=“abcdefghij”,則s[1]=“b”,s[9]="j",而字符串的零位正是它的長度,如s[0]=10(※上述功能Ansistring沒有。),這可以給我們提供很多方便,如高精度運算時每一位都可以轉化為數字存入數組。
字符串數據類型是建模在形式字符串的想法上的數據類型。字符串是幾乎在所有編程語言中可以實現的非常重要和有用的數據類型。在某些語言中它們可作為基本類型獲得,在另一些語言中做為復合類型獲得。
多數高級語言的語法允許通常用某種方式引用起來的字符串來表示字符串數據類型的實例;這種元字符串叫做“文本”或“字符串文本”。
3、結束標志不同
字符串: 必須以'\\0'結尾;// ‘ \\0 ’ 的意義是“字符串結束符”。
字符數組: 可bai以包含多個'\\0',但是如果當做字符串處理,則實際有效字符串為第一個'\\0'的簽名的字符串,如果當做字符數組處理,可以處理字符數組的任何一個字符,所有的字符都可以是'\\0'。
4、特點不同
字符串在存儲上類似字符數組,所以它每一位的單個元素都是可以提取的,如s=“abcdefghij”,則s[1]=“b”,s[9]="j"。
而字符串的零位正是它的長度,如s[0]=10(※上述功能Ansistring沒有。),這可以給我們提供很多方便,如高精度運算時每一位都可以轉化為數字存入數組。
字符數組是指用來存放字符數據的數組。其定義的一般形式為:char 數組名[數據長度] 。字符數組用于存放字符或字符串,字符數組中的一個元素存放一個字符,它在內存中占用一個字節。C語言中沒有字符串類型,字符串是存放在字符型數組中的。
三、字符串示例
strdup與strcpy
函數和功能描述:
①extern char *strdup(char *s);
頭文件: string.h
功能: 將串拷貝到新建的位置處
說 明: strdup不是標準的c函數。strdup()在內部調用了malloc()為變量分配內存,不需要使用返回的字符串時,需要用free()釋放相應的內存空間,否則會造成內存泄漏。
返回值: 返回一個指針,指向為復制字符串分配的空間;如果分配空間失敗,則返回NULL值。
②char strcpy(char dest, const char *src);
頭文件: #include
功能: 把從src地址開始且含有NULL結束符的字符串復制到以dest開始的地址空間
說明: strcpy是標準的C語言標準庫函數。src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字符串。
返回值: 返回指向dest的指針。
總結:
1.strdup可以直接把要復制的內容復制給沒有初始化的指針,因為它會自動分配空間給目的指針,strcpy的目的指針一定是已經分配內存的指針。
2.strdup用完要free()函數釋放內存,否則內存泄露 。
3.使用strcpy必須事先確定src大小,可以先strlen判斷src的大小,之后為dest申請空間,之后再strcpy就不會有問題了。
內存函數
內存函數直接對內存操作,不僅能夠處理字符串,還能夠處理不論什么類型的數組、結構等。
在標準C中,這些函數被覺得是字符串函數的一部分,是在頭文件string.h中聲明的。
void * memcpy(void *dest, const void *src, size_t n) ;
//從src地址處復制n個字節到dest , 并返回地址dest的值
void * memmove(void *dest, const void *src, size_t n) ;
//其功能與上個函數同樣。差別在于:memmove函數在源內存區域和目標內存區域重疊的情況下也能正確運行操作。
void * memchr(const void ptr, int val, size_t len) ;
/在地址ptr后的前len個字符中搜索val值的第一次出現。
假設找到val。它返回一個指向包括val值的第一個字符的指針,否則返回一個null字符。(每一個字符依據表達式(unsigned char)c == (unsigned char)val 比較)*/
void * memset(void * ptr, int val, size_tlen) ;
//把val拷貝到從ptr開始的len個字符中,ptr所指定的字符被覺得是unsignedchar類型
int memcmp(const void * ptr1, const void * ptr2, size_t len) ;
//把ptr1的前len個字符與ptr2的前len個字符進行比較。假設第一個字符串按字典順序小于第二字
-
字符
+關注
關注
0文章
234瀏覽量
25266 -
字符串
+關注
關注
1文章
585瀏覽量
20612 -
數組
+關注
關注
1文章
417瀏覽量
26034
發布評論請先 登錄
相關推薦
數組、向量和字符串 實驗
C語言的字符串處理函數
![<b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>字符串</b>處理函數](https://file.elecfans.com/web1/M00/9E/32/o4YBAF031XGAJX-cAAJGpGOq9NI528.png)
評論