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

C語(yǔ)言字符串轉(zhuǎn)數(shù)字實(shí)現(xiàn)方法
c語(yǔ)言之字符數(shù)組詳解
C語(yǔ)言的字符串處理函數(shù)

用指針實(shí)現(xiàn)字符串拷貝的程序和字符型指針變量與字符數(shù)組的區(qū)別說(shuō)明

評(píng)論