利用數組名和下標操縱數組中的數據是“我喊你的名字,你敢答應嗎”。由編譯器幫你翻譯,找地址,存取數據。
利用指針法操縱數組是“按址索驥,直搗黃龍”。直接找到地址,然後進行操縱數據。
初學指針者,問題比較多。
無他,唯多看程序、多寫程序,方可“救治”。
下面我們針對一道熟悉的題目來看一看指針怎樣處理字符串。
一、題目描述
請把下面的函數補充完整:
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);//異常退出程序