利用数组名和下标操纵数组中的数据是“我喊你的名字,你敢答应吗”。由编译器帮你翻译,找地址,存取数据。
利用指针法操纵数组是“按址索骥,直捣黄龙”。直接找到地址,然后进行操纵数据。
初学指针者,问题比较多。
无他,唯多看程序、多写程序,方可“救治”。
下面我们针对一道熟悉的题目来看一看指针怎样处理字符串。
一、题目描述
请把下面的函数补充完整:
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);//异常退出程序