weixin_37734052 2017-03-09 11:00 采纳率: 0%
浏览 1295

《C程序设计语言》第四章计算器程序getop函数没有看懂,哪位好心人能帮我这个小白解决一下?

在书中的位置是66页,原代码如下:

 /* 获取下一个运算符或者数值操作值*/
int getop(char s[])
{
    int i,c;

    while((s[0]=c=getch())==' '||c=='\t') //跳过空格与换行符 
        ;
    s[1]='\0';                          //????? 
    if(!isdigit(c)&&c!='.')             //不是数,也就是说是运算符? 
        return c;
    i=0;
    if(isdigit(c))                      //收集整数部分 
        while(isdigit(s[++i]=c=getch()))
            ;
    if(c=='.')                          //收集小数部分 
        while(isdigit(s[++i]=c=getch()))
            ;
    s[i]='\0';
    if(c!=EOF)
        ungetch(c);
    return NUMBER;
 } 

我不太明白 s[1]='\0'; 这个语句有什么意义,在收集整数和小数的时候这个语句存入的数据又会被覆盖,所以为什么要加这个语句?
还有一个语句我不太清楚它的意思。

    if(!isdigit(c)&&c!='.')             
                    return c;

书中注释是“不是数”,那么也就是说它是运算符了?这个我是想确认一下。

如果哪位能解决我的问题,我真是感激不尽!

  • 写回答

3条回答 默认 最新

  • 赵一村 Yisen 2021-10-09 16:46
    关注

    因为这里定义的s是一个字符数组,而不是字符串常量。这两个东西有唯一的区别:字符串常量在系统中保存的时候以字符数组的形式保存,会自动添加'\0'。
    所以这个程序的变量s,如果在下一条if语句返回的话,必须在s结尾添加'\0'以此作为字符数组的结尾。
    简单来说,声明一个字符串常量,可以没有空字符。但是声明字符数组,结尾必须是空字符。

    评论

报告相同问题?

悬赏问题

  • ¥15 请求分析基于spring boot+vue的前后端分离的项目
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥20 为什么我写出来的绘图程序是这样的,有没有lao哥改一下
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?