C語言字符串替換:字符,字符串,字符數組詳解

案例描述

字符串替換是處理字符串時最常見的操作之一,也是學習字符串必須掌握的知識。本案例要求通過編程實現字符串“Good moring”到“Good evening”的轉換。

案例分析

我們需要從字符串中被替換的位置開始,將要替換的內容逐個復制到原字符串中,直到字符串結束或者替換的字符串結束為止。

為瞭順利完成案例,需要先學習字符數組,字符串,字符指針等基礎知識。

必備知識

1,字符數組

字符數組是存放字符數據的數組,其中每一個元素都是單個字符

(1)字符數組的定義

字符數組定義的語法格式如下:

char 數組名[常量表達式]; 
char 數組名[常量表達式1][常量表達式2]

在上述語法中,分別列舉瞭定義一維字符數組和二維字符數組的方法。

示例代碼如下:

char ch[6];

(2)字符數組的初始化

在數組定義的同時也可以對數組中的元素進行賦值,這個過程稱為數組的初始化,示例代碼如下:

char c[5] = {'h','e','l','l','o'};

註意

字符數組的初始化很簡單,但要註意以下幾點。

(1)元素個數不能多於字符數組的大小,否則編譯器會出錯

(2)如果初始項少於數組長度,則空餘元素均會被賦值為空字符(‘\0’)

(3)如果沒有指定數組大小,則編譯器會根據初始項的個數為數組分配長度

(4)也可以初始化二維數組

(和整型數組基本一致)

2,字符串概念

(1)字符串的概念

字符串是由數字、字母、下劃線和空格等各種字符組成的一串字符,是個常量,字符串的末尾都默認有一個’\0’作為結束符。

“abcde”
”     “

上面這兩行都是字符串,隻不過第二個字符串中的字符都是空格

字符串在各種編程語言中都是非常重要的數據類型,但是C語言中沒有字符串的固定類型,通常用字符數組的形式來存儲和處理字符串,這種字符數組必須以’\0’結尾。當把一個字符串存入一個字符數組時,也應把結束符存入數組,因此該字符數組的長度是實際字符數加一。

(2)用字符初始化字符數組

為瞭便於對字符數組進行初始化操作,可以直接使用一個字符串常量來為另一個字符數組賦值,具體實例如下:

char char_array[6] = {"hello"};
char char_array[] = {"hello"};

(3)獲取字符串的長度

字符串用數組來存儲,用sizeof運算符來求取各種數據類型的長度,sizeof運算符也可以用來求字符串的長度,例如sizeof(“abcde”)。

除瞭可以使用sizeof運算符外,還可以使用strlen()函數來獲取字符串長度,strlen()函數原型如下:

unsigned int strlen(char *s);

其中s是指向字符串的指針,返回值是字符串的長度。需要註意的是,使用strlen()函數得到的字符串並不包括末尾的空字符’\0’。

sizeof運算符和strlen()函數在求字符串時是有所不同的

兩者的區別具體如下:

1,sizeof是運算符,strlen()函數是C語言標準庫函數,包含在string.h頭文件裡

2,sizeof運算符功能是獲得所建立對象的字節大小,計算類型所占內存;strlen()函數是獲得字符串所占內存的有效字節數。

3,sizeof運算符的參數可以是數組,指針,類型,對象和函數等;strlen()函數的參數必須是指向以’\0’結尾的字符串的指針

4,sizeof運算符計算大小在編譯時就完成,因此不能用來計算動態分配內存的大小;strlen()函數結果要在運行時才能計算出來

註意

C語言中的字符串實際上是字符數組,而字符是一種基本數據類型,在字符和字符串之間進行轉換是很容易的,接下來,將char a = ‘A’轉化為字符串,具體步驟如下:

(1)創建一個長度為2的字符數組:

char a_str[2];

(2)將第一個元素設置為對應的字符,第二個元素設置為空字符

a_str[0] = a;
a_str[1] = '\0';

同理將字符串轉化為多個字符也很簡單,具體示例如下:

char a_str[] = "AB";
char a = a_atr[0];
char b = a_atr[1];

在上述代碼中,定義瞭一個字符數組a_str[],該字符數組中保存的是字符串“AB”。隻要將字符串的每個字符賦值給字符變量a,b,就可以完成字符串轉化為字符的操作。

3,字符串與指針

在C語言中,字符型指針用char * 來定義,它不僅可以指向一個字符型常量,還可以指向一個字符串。為瞭描述字符串與指針之間的關系,示例代碼如下:

char char_array[] = "hello";
char* ch = char_array;

以上代碼,字符指針ch即指向字符‘h’又指向字符串“hello”:如果以“%c”輸出,則隻輸出當前指針指向的字符;如果以“%s”輸出,則會輸出後面的連續內存空間的數據,直到遇到‘\0’為止。

4,字符數組與字符指針

字符數組與字符指針,也可以取數組地址賦值給字符型指針。字符數組與字符指針圍繞字符串有千絲萬縷的關系,接下來總結一下兩者的區別與聯系:

(1)存儲方式

字符數組在用字符串初始化時,這個字符串就存放在瞭字符數組開辟的內存空間中;而字符指針變量在用字符串常量初始化時,指針變量中存儲的是字符串的首地址,但字符串存儲在常量區。

上面的文字比較晦澀,下面通過一段示例代碼來輔助理解,具體如下:

char str[6] = "hello";
char*p = "hello"

上面兩行代碼中定義的變量在內存區的存儲方式如圖:

在這裡插入圖片描述

(2)初始化與賦值方式

初始化方式
可以對字符指針變量賦值,但不能對數組名賦值。示例代碼如下:

char *p = "hello";   //等價於char *p ;p = "hello";
char str[6] = "hello";  //char atr[6];str = "hello";這種寫法錯誤

賦值方法

使用數組定義的字符串隻能通過為數組中的元素逐一賦值或通過調用賦值函數的方式來賦值,而使用指針定義的字符串還可以實現直接賦值。示例代碼如下:

char *p1 = "hello" ,*p2; p1 = p2;
char str1[6] = "hello" ,str2[6];
//str1 =str2 錯誤,數組賦值不可行

(3)字符指針與數組名

字符指針變量是可以改變的,而數組名是一個指針常量,其值不可以改變,代碼示例如下:

char *p = "hello world";
p += 7;  //字符指針變量可以改變

對字符數組char str[6] = “hello”來說,數組名是常量指針,不可改變

(4)字符串中字符的引用

可以用下標法和地址法引用數組元素,同樣的,也可以用地址法,指針變量加下標法來引用字符串的字符元素,示例代碼如下:

char *p str[100] = "hello world";
char ch1 = str[6];
char *p = "hello world";
char ch2 = p[6]; //等價於char ch2 = *(p + 6)

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: