OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3171|回复: 3

为什么使用*strtemp==0这句判断?

[复制链接]

7

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-1-23
在线时间
4 小时
发表于 2015-8-6 14:18:24 | 显示全部楼层 |阅读模式
5金钱
USMART调试组件实验,文件usmart_str.c,函数u8 usmart_get_fname(u8*str,u8*fname,u8 *pnum,u8 *rval)
[mw_shl_code=c,true]u8 usmart_get_fname(u8*str,u8*fname,u8 *pnum,u8 *rval) { u8 res; u8 fover=0; //括号深度 u8 *strtemp; u8 offset=0; u8 parmnum=0; u8 temp=1; u8 fpname[6];//void+X+'/0' u8 fplcnt=0; //第一个参数的长度计数器 u8 pcnt=0; //参数计数器 u8 nchar; //判断函数是否有返回值 strtemp=str; while(*strtemp!='\0')//没有结束 { if(*strtemp!=' '&&(pcnt&0X7F)<5)//最多记录5个字符 { if(pcnt==0)pcnt|=0X80;//置位最高位,标记开始接收返回值类型 if(((pcnt&0x7f)==4)&&(*strtemp!='*'))break;//最后一个字符,必须是* fpname[pcnt&0x7f]=*strtemp;//记录函数的返回值类型 pcnt++; }else if(pcnt==0X85)break; strtemp++; } if(pcnt)//接收完了 { fpname[pcnt&0x7f]='\0';//加入结束符 if(usmart_strcmp(fpname,"void")==0)*rval=0;//不需要返回值 else *rval=1; //需要返回值 pcnt=0; } res=0; strtemp=str; while(*strtemp!='('&&*strtemp!='\0') //此代码找到函数名的真正起始位置 { strtemp++; res++; if(*strtemp==' '||*strtemp=='*') { nchar=usmart_search_nextc(strtemp); //获取下一个字符 if(nchar!='('&&nchar!='*')offset=res; //跳过空格和*号 } } strtemp=str; if(offset)strtemp+=offset+1;//跳到函数名开始的地方 res=0; nchar=0;//是否正在字符串里面的标志,0,不在字符串;1,在字符串; while(1) { if(*strtemp==0) { res=USMART_FUNCERR;//函数错误 break; } else if(*strtemp=='('&&nchar==0) fover++;//括号深度增加一级 else if(*strtemp==')'&&nchar==0) { if(fover) fover--; else res=USMART_FUNCERR;//错误结束,没收到'(' if(fover==0) break;//到末尾了,退出 } else if(*strtemp=='"') nchar=!nchar; if(fover==0)//函数名还没接收完 { if(*strtemp!=' ')//空格不属于函数名 { *fname=*strtemp;//得到函数名 fname++; } } else //已经接受完了函数名了. { if(*strtemp==',') { temp=1; //使能增加一个参数 pcnt++; } else if(*strtemp!=' '&&*strtemp!='(') { if(pcnt==0&&fplcnt<5) //当第一个参数来时,为了避免统计void类型的参数,必须做判断. { fpname[fplcnt]=*strtemp;//记录参数特征. fplcnt++; } temp++; //得到有效参数(非空格) } if(fover==1&&temp==2) { temp++; //防止重复增加 parmnum++; //参数增加一个 } } strtemp++; } if(parmnum==1)//只有1个参数. { fpname[fplcnt]='\0';//加入结束符 if(usmart_strcmp(fpname,"void")==0)parmnum=0;//参数为void,表示没有参数. } *pnum=parmnum; //记录参数个数 *fname='\0'; //加入结束符 return res; //返回执行结果 } [/mw_shl_code]
如题,为什么使用*strtemp==0这个判断 [mw_shl_code=c,true] nchar=0;//是否正在字符串里面的标志,0,不在字符串;1,在字符串; while(1) { if(*strtemp==0) { res=USMART_FUNCERR;//函数错误 break; }[/mw_shl_code]


最佳答案

查看完整内容[请看2#楼]

因为0是字符串的结束符,函数(字符串)开始的地方,肯定不可能是结束符啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-8-6 14:18:25 | 显示全部楼层
因为0是字符串的结束符,函数(字符串)开始的地方,肯定不可能是结束符啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-7-16
在线时间
3 小时
发表于 2015-8-6 14:54:12 | 显示全部楼层
翻书看函数名什么情况下是合法的?
回复

使用道具 举报

3

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2018-8-18
在线时间
67 小时
发表于 2019-12-7 17:14:07 | 显示全部楼层
正点原子 发表于 2015-8-6 14:18
因为0是字符串的结束符,函数(字符串)开始的地方,肯定不可能是结束符啊

'\0'的ascii编码就是整数0(不是字符'0')。
故char c=0 与c='\0'没有区别。
但与 c='0' 完全不同。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 13:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表