C语言指针基础(2)

在上一篇中,我们主要结合了画图,形象的展示了一级指针与内存的关系。在这一篇中,我们将继续通过一道关于字符串的题目来加强我们的以及指针。题目很简单,就是将一个字符串的前后的空格去掉,形成一个新的字符串。类似于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’;这句。是为了标志字符串结束。

这就是今天的字符串练习指针。如果有不理解的地方,可以试试我们前面讲的画图方法。结合图理解一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值