小问题汇总——i++,strcpy函数,*p==0判断

#include <stdio.h>
#include <stdbool.h>

bool isMatch(char * s, char * p){
    if(*p == 0) return *s ==0;
    /*字符串结束符 '\0' 的 ASCII 值 正好是 0。 所以 用 0 判断 和 用 '\0'判断,结果一样。
      用 '\0' 用 0 完全是个人习惯。*/
    auto first_match=*s&&(*s==*p||*p=='.');
    if(*(p+1)=='*'){
        return isMatch(s,p+2)||(first_match&&isMatch(++s,p));
    }
    else{
        return first_match&&isMatch(++s,++p);//i++先做别的事,再自己加1,++i先自己加1,再做别的事情
    }
}
int main()
{
    bool res=isMatch("aabd","a*b.");
    printf("Hello World!\n%d",res);
    return 0;
}

这是一个正则表达匹配程序。

问题1:i++和++i区别

++先做别的事,再自己加1,++i先自己加1,再做别的事情

#include <stdio.h>

int main()
{
    char *str="123456";
    int i=0;
    printf("%c,%d\n",str[i],i);
    printf("%c,%d\n",str[++i],i);
    printf("%d\n",i);
    printf("%d\n",++i);
    printf("%d\n",i++);
    printf("%d\n",i);
    while(str[i]==str[++i]){}
    printf("%d\n",i);
    return 0;
}

运行结果: 

栈操作也是一样

不是一样的。优先级别: ++ , *,= 编译器从左到右
*S.top++=e
栈顶位置后++,本次运算S.top栈空间不变,所以是把S栈顶指针指向E,运算完成后栈空间才自增1
*++S.top=e
栈顶位置前++,本次运算S.top栈顶向前增加1,所以是把S栈新增的栈顶指向E。

问题2 :strcpy(a,b);

char *a; 错

char a[10]; 对

char *a=malloc(10);对

原因是需要一个初始化了的地址a,来存放b。

问题3 :strcpy(a,b)和a=b的区别

a=b是地址复制,指针a和b指向同一个地址;是修改了a的指向

strcpy(a,b)是将b中存储的内容复制到a中。

问题4 :函数中修改字符串并传出

void change_value1(char *pp)
{
   char *str="the value has been changed! \n";
   pp=str;
}
void change_value2(char *pp)
{
   char *str="the value has been changed! \n";
   pp=malloc(100);
   strcpy(pp,str);
}
int main(int argc, char **argv)
{
    char *p=NULL;
    change_value1(p);
    change_value2(p);

这两种都不行,pp是p在函数中的副本,原本pp和p中内容相同,即指向同一位置,但是因为 pp=str;和pp=malloc(100);

两种方式都是改变了pp的内容,即改变了pp所指向的地址,因此pp的变化影响不到p了,pp所指向的新地址的内容变化,

而p所指向的内容并没有更改。因此这里就需要用到二级指针。

status DeQueue(LinkQueue *q,char **data){
    QNode *p;
    p=q->front->next;
    char *s=malloc(10);
    //s=(char*)p->data;//这样也可以
    strcpy(s,p->data);//二级指针使用。strcpy(s,q->front->data)会出错,q->front并没有存储数据
    *data=s;
    if(q->rear==p)q->rear=q->front;
    free(p);
    return OK;
}
int main()
{
    LinkQueue Q;
    InitQueue(&Q);
    EnQueue(&Q,"aaa");
    EnQueue(&Q,"bbb");
    char *s=malloc(10);
    DeQueue(&Q,&s);
    printf("Hello World! %s \n",s);

问题5:if(*p == 0)

if(*p == 0) return *s ==0;

*p==0,是用字符的 ASCII 值 来判断 字符串结束。
字符串结束符 '\0' 的 ASCII 值 正好是 0。 所以 用 0 判断 和 用 '\0'判断,结果一样。
用 '\0' 用 0 完全是个人习惯。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值