#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 完全是个人习惯。