按址索驥,直搗黃龍-指針法在字符串str中每個ch2字符後都添加一個ch3字符

利用數組名和下標操縱數組中的數據是“我喊你的名字,你敢答應嗎”。由編譯器幫你翻譯,找地址,存取數據。

利用指針法操縱數組是“按址索驥,直搗黃龍”。直接找到地址,然後進行操縱數據。

初學指針者,問題比較多。

無他,唯多看程序、多寫程序,方可“救治”。

下面我們針對一道熟悉的題目來看一看指針怎樣處理字符串。

一、題目描述

請把下面的函數補充完整:

void func(char *str, char ch2, char ch3)

{//str存儲某個字符串的首地址

//要求在str中每個ch2字符後面都添加一個ch3字符

}

二、原理介紹

1、另設一個字符數組str2,大小爲str中字符長度的二倍多一。因爲若str的長度爲n,且這n個字符全部爲ch2,則插入ch3後長度爲2*n,再加上結束符\0,需要空間2*n+1.

2、對於str中的每個字符進行操作,先把其放入str2,然後對其值進行判斷,如果其是ch2,則把ch3也放入

3、最終在str2結尾放入一個'\0'表示串的結束

4、把str2中字符串拷貝回str

三、實現

#include <stdio.h>
#include <string.h>
#include <ctype.h>
void func(char *str, char ch2, char ch3)
{
	char *pb,*pc;
	pb=str;	
	int n;
	n=strlen(str);//字符串的長度 
	char str2[2*n+1] ;//另設一數組,以空間換時間 
	pc=str2; 
	
	while(*pb!='\0')
	{
		*pc=*pb;//原字符複製 
		pc++; 		
		if(*pb==ch2)
	    {		    
	        *pc=ch3;//插入新字符 
	        pc++;
	    }
	    pb++;
	    
	}
	*pc='\0' ; 
	//此時n、p都不再指向數組B、C的首地址了 
    strcpy(str,str2);//把更改後的串複製回B指向的空間 
}

int main()
{
    char s[1000]="acagazax",ch2='a',ch3='*';
	//在所有的字符a後面都添加字符* 
    func(s,ch2,ch3);
    puts(s);
    return 0; 
}

用好了指針,就不用下標了,

想一想,*p和p[i],會少輸入兩個字符呢

能減少手指敲鍵盤的次數,減少得腱鞘炎的機率

想起來,半夜都能笑醒呢!

 

注:char str2[2*n+1] 是C99的語法,變長數組。

可以用動態數組替代:

char *str2;

int n=strlen(str);

str2=(char*)malloc(2*n+1);//臨時空間

if(str2==0)     exit(-1);//異常退出程序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章