这个题目我想很久没明白啥意思.写到最后才明白,这个pos应该是对每个输入行从第几个字符到第几个字符进行比较.这样理解应该是对的.
前面函数定义暂时跳过.
直接进入主函数.
声明也跳过.
首先就是用readargs函数处理参数.
那么先进入readargs函数.
这里的处理方式与前几个练习的主函数的方法是一样的.
首先判断程序参数剩余数量,并且判断参数字符串首字符是'-'号或者是'+'号.
符合条件执行循环体.
如果是'-'号并且,当前参数(argv在之前已经被自增到'-'号参数的字符串地址)不是数字.
执行下列循环体程序块.
判断当前参数.
*++argv[0]就是'-'号后面的具体参数.
然后判断参数具体是哪种,之后执行相应的操作.
然后就到了另一种情况,就是参数带'-'号,但是是数字的情况.
通过atoi函数,将参数转化为数字.保存到变量pos2.
然后另一种情况,就是'+'号.(因为最外层while已经判断为真的情况下最后一个判断式就是'+'号,所以程序走到这里只剩'+'号一个选择了.)
同样是将参数保存到pos1中,在判断式中完成赋值的同时进行判断,是否小于0,如果小于0输出错误提示.
下面是numcmp.c的源文件
首先numcmp函数需要用到substr函数.
所以先看substr.
这个函数说简单也没什么难的.
首先计算参数输入行的长度(len).
然后判断输入行的正确性,
是否有pos2参数,输入行是否大于pos2.
如果大于就将输入行终点限定在pos2的位置.
然后如果输入行小于参数pos2,那么输出错误报告.
然后是将以pos1为开始pos2为结束的字符串内容复制到str中.
最后加上NUL空字符.
回到numcmp函数.
substr处理输入行.
然后将处理后的输入行转化为浮点数(atof).
然后进行比较.
至于charcmp.(写到这里我才突然明白pos1和pos2到底是干啥的)
如果有参数pos2.
那么将pos2设置为比较结束的地方.
否则将最长输入行的长度,当做比较范围.
然后是判断参数dir,执行相应操作,跳过非字符数字空格等的地方.
然后是比较.判断是否需要不区分大小写(fold).进行比较后返回相应的值.
这个练习相对来说耗时真的长,原因就是不知道题目是啥意思.pos弄半天不知道干啥的.