在上一篇中,我们主要结合了画图,形象的展示了一级指针与内存的关系。在这一篇中,我们将继续通过一道关于字符串的题目来加强我们的以及指针。题目很简单,就是将一个字符串的前后的空格去掉,形成一个新的字符串。类似于char *str = ” asd “;前后去掉空格,形成一个新的字符串类似于 char *des = “asd”;下面是我们的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int trimSpace(char *src,char *des)
{
int res = 0;
int i = 0,j = 0,count = 0;
if(src == NULL || des == NULL || strlen(src) <= 0)
{
res = -1;
printf("trimSpace err: %d ",res);
return res;
}
while(src[i] == ' ' && src[i] != '\0')
{
i++;
}
j = strlen(src) - 1;
while(src[j] == ' ' && src[j] != '\0')
{
j--;
}
count = j - i + 1;
memcpy(des,src + i,count);
des[count] = '\0';
return res;
}
void main()
{
char *str = " asd ";
char buf[1024];
int res;
memset(buf,0,sizeof(buf));
res = trimSpace(str,buf);
if(res != 0)
{
//err
return;
}
printf("res:%s:res",buf);
}
结果是:res:asd:res,显然已经去掉了前后的空格。(为了看清楚,所以前后加了res);
现在,我们的就来详细的讲解一下这段代码。
先看这一句char *str = ” asd “;其中的“ asd “是常量,存在常量区,str指针只是指向了那一片内存,准确的说是首地址。对于常量,再补充一下,不要想通过 *str来改变常量的值。
再看一句res = trimSpace(str,buf);对比函数int trimSpace(char *src,char *des),函数参数src与des只是也指向那片内存了,src与str,des与buf其实没多大关系。这在上篇也已讲过。
进入函数主体,显示声明一些变量,再判断参数是否为NULL,这在上篇也已讲过,这里就不详述了。
现在,我们来看这句:
while(src[i] == ’ ’ && src[i] != ‘\0’)
{
i++;
}
从头遍历src,如是空格而且不等于’\0’就将i++,如不是就退出循环。此时说明i已经是第一个不是空格的字符的下标。对于char *str = “ asd “;循环结束,i应该等于2(asd前有两个空格)。也就是说此时的src[i]就是访问到这个‘a’;
在看这两句:
j = strlen(src) - 1;
while(src[j] == ’ ’ && src[j] != ‘\0’)
{
j–;
}
开始前,先设置环境,让j等于最后一个真正字符位置下标(就是’\0’前面的字符的下标)。对于char *str = “ asd “;此时的j等于6。
紧接着就进入循环,与之前的循环很相似,只是这次是从尾开始遍历,直到不是遇到空格而且不等于’\0’为止。
再看这三句,
count = j - i + 1;
memcpy(des,src + i,count);
des[count] = ‘\0’;
当我们到这的时候,已经获得了字符’a’和字符’d’的下标,很容易就获得了一共有多少个字符,即count。
我们再通过memcpy(des,src + i,count);这句话就实现了赋值到des的操作。memcpy函数strcpy函数相似,都是复制。只是strcpy是复制字符串,memcpy是复制字节。我们这里是从src + i的位置开始,一共复制count个字节,再将这count个字节赋值给des指向的开始的地址。
之后面我们加了des[count] = ‘\0’;这句。是为了标志字符串结束。
这就是今天的字符串练习指针。如果有不理解的地方,可以试试我们前面讲的画图方法。结合图理解一下。