1. 程式人生 > >c語言 如何用指標來處理字串?

c語言 如何用指標來處理字串?

文章目錄


讀者,你好!
如果你精通C,希望能得到你的斧正;如果你是初學者,希望能對你有所幫助。
加粗的是一些我認為比較重要的內容。
#一、字元指標
##1、字元指標輸出字串
為了更好的理解這部分內容,我們先看一個例子:
#include <stdio.h>
int main()
{
	char *ps ;
	ps = "C language!";		/*定義字元指標*/
	printf("%s\n", ps);  /*用字元指標PS來輸出字串的內容*/ 
	 return 0;
}

執行結果為:
這裡寫圖片描述
這個列子中,字串“C language!”, 儲存在連續的無名儲存區中,通過語句ps = "C language!

, 將無名儲存區的首地址賦給指標ps,也就是說,指標變數ps 指向無名儲存區域的首地址,而不是把無名儲存區域的內容儲存在ps中,

|C| |l|a|n|g|u|a|g|e|!|\0|
|—|-----|----|----|----|

ps^
##2、字元指標處理字串
還是從具體的列子出發:

#include <stdio.h>
int main()
{
	char *ps = "C language!";
	int n = 2;
	
	ps = ps+2;		/*移動指標ps*/ 
	printf("%s\n", ps);
	return 0;	
} 

執行結果:
這裡寫圖片描述

這裡初始化的時候把首地址賦給了ps , 後面操作ps= ps+2

時,ps指向l 所在的空間。
##3、字元陣列與字元指標處理字串有何不同

  • 佔用空間不同。陣列所佔空間取決於陣列的長度,而指標只佔用4位元組,用以存放字串的首地址。
  • 賦值方式不同指標本身是變數,所以可以這樣char *ps; ps = "C language!"; 賦值, 而陣列不能這樣char A[20];A = "C language!;賦值,而要逐個賦值。
    #二、指標陣列

##    指標陣列的說明形式

語法 型別識別符號 *陣列名[整形常量表達式];
樣列 int *p[3];
說明 “int *p[3];”表示p是一個指標陣列名,他有三個元素p[0],p1],p[2],每個元素都是一個指標,而這些指標都指向整形變數。

注意不要寫成int (*p)[3]; 這是上一篇說的指向陣列的指標變數,表示長度為3的指向一維陣列的指標變數。

  • 指標陣列比較適合於用來指向若干個字串,是字串處理更加靈活方便。

  • 比如圖書館有若干本書,要將這些書名存在一個數組中,一般的方法用二維陣列來存,就得定義該字元陣列的列數為最長書名的長度,這樣就非常浪費空間。

  • 用指標陣列則可以讓指標陣列中的各個元素,指向各字串(書名),這樣排序時,不必改動字串的位置,而是改動指標陣列中個元素的指向。

  • 這樣,各字串的元素可以不同,而且移動指標變數的值(地址),就比移動字串所花的時間少得多。

#include <stdio.h>
#include <string.h>
#define N 5
int main()
{
	char *name[N] = {"Data Structure", "Programming C", "Java", "Operating System", "Data base"};
	char *temp;
	int i, j, front;
	
	for(i = 0; i < N -1;i++)
	{
		front = i;           //假設按字典順序,第i個書名應位於前
		for(j= i + 1;j < N;j++)
		{
			if(strcmp(name[front], name[j]) > 0)//判斷其先後順序是否合理
			{
				front = j;
			}
			
		}
		if(front != i) //若順序不合理,也就是原先的假設不成立,交換指標的值(地址)
		{
			temp = name[front];
			name[front] = name[i];
			name[i] = temp;
		}
	}
	for(i= 0;i<N;i++)
	{
		printf("%s\n", name[i]);
	}
	return 0 ;
} 

執行結果:
這裡寫圖片描述
這段演算法,後面部分與一般的陣列差不多,但其效率卻比較高。

送福利了