对于这个练习虽然只是之前的改进版本,但是有很多地方都需要仔细想一下.
首先那个static的数组声明,通过static的声明,变量的内容是永久保存的,也就是说就算退出函数变量的值依然不变.并且他也有对其他函数隐藏的作用.
然后是将lastc数组的值赋值给变量c.书上也说了可以用直接用赋值表达式.所以没别的用意.但是有一点需要说明,就是不能保证是第一次调用getop函数,如果之前调用过那么lastc会保存最后读取的字符.所以这里通过lastc对变量c赋值是有必要的,如果是第一次调用当然只是将那个空白符给c了.
然后清空这个应该是算是缓冲区的lastc(因为已经将内容给c了).
然后判断c是不是空格或者制表符.(当然只是判断单个字符)并且赋值给数组s.
然后调用sacnf函数读取输入判断是不是到了文件末尾或者出错.
然后再次通过while判断c,直到遇到非空白符后.停止循环..
书上说scanf遇到EOF并不会改变变量c的内容.应该是c还是遇到EOF之前的那个字符的意思.所以后面又填了一个c = EOF.(应该是这样.)
然后暂时将数组s封闭.
如果这个字符不是数字或者小数点.
那么将这个字符返回到调用函数那里,不做收集.
程序走到这里证明之前的判断式不是数字或小数点为假,那么表明这里不是数字就是小数点,所以用先执行一次的do.while循环就可以.
变量i被初始化为0,所以之后的++i就是下标1,会把之前的那个空字符'\0'覆盖.
如果是数字(这个判断式依据的是保存在s[0]中的字符,因为在前面判断不是空白符之后就没有再读取过.).
继续用scanf函数读取字符并将结果保存在变量rc中.
然后保存在数组s中之后判断该字符是不是数字.
如果不是则终止循环.
判断导致终止循环的这个字符是不是小数点.如果是,执行循环体.
继续读取.
如果不是小数点,则将数组s中的这个字符覆盖.
然后判断是否读取到末尾.
如果没到末尾.将导致终止循环的那个字符保存在lastc中以备下次调用时继续使用.