部分答案参考了官方题解和网上的答案,仅供参考,可能也有部分bug未发现或解决。
exercise5-1
|
|
在上面的例子中,如果符号+或-的后面紧跟的不是数字,getint 函数将把符号视为数字 0 的有效表达方式。修改该函数,将这种形式的+或-符号重新写回到输入流中。
|
|
|
|
exercise5-2
模仿函数 getint 的实现方法,编写一个读取浮点数的函数 getfloat。getfloat 函数的返回值应该是什么类型?
代码:
|
|
运行:
|
|
exercise5-3
用指针方式实现第 2 章中的函数 strcat。函数 strcat(s, t)将 t 指向的字符串复制到 s 指向的字符串的尾部。
代码:
|
|
运行:
|
|
exercise5-4
编写函数 strend(s, t)。如果字符串 t 出现在字符串 s 的尾部,该函数返回 1;否则返回 0。
|
|
运行:
|
|
exercise5-5
实现库函数 strncpy、strncat 和 strncmp,它们最多对参数字符串中的前 n 个字符进行操作。例如,函数 strncpy(s, t, n)将 t 中最多前 n 个字符复制到 s中。
|
|
运行:
|
|
exercise5-7
重写函数 readlines,将输入的文本行存储到由 main 函数提供的一个数组中,而不是存储到调用 alloc 分配的存储空间中。该函数的运行速度比改写前快多少?
|
|
增加函数:
|
|
exercise5-8
函数 day_of_year 和 month_day 中没有进行错误检查,请解决该问题。
对输入的月份、天数进行检查
|
|
运行:
|
|
exercise5-9
用指针方式代替数组下标方式改写函数 day_of_year 和 month_day。
|
|
运行:
|
|
exercise5-10
编写程序 expr,以计算从命令行输入的逆波兰表达式的值,其中每个运算符或操作数用一个单独的参数表示。例如,命令 expr 2 3 4 + * 将计算表达式 2 × (3 + 4)的值。
|
|
运行(命令行中,’*‘需要反斜杠来转义):
|
|
exercise5-13
编写程序 tail,将其输入中的最后 n 行打印出来。默认情况下,n 的值为10,但可通过一个可选参数改变 n 的值,因此,命令
tail -n
将打印其输入的最后 n 行。无论输入或 n 的值是否合理,该程序都应该能正常运行。编写的程序要充分地利用存储空间;输入行的存储方式应该同 5.6 节中排序程序的存储方式一样,而不采用固定长度的二维数组。
|
|
运行:
|
|
exercise5-14
修改排序程序,使它能处理-r 标记。该标记表明,以逆序(递减)方式排序。要保证-r 和-n 能够组合在一起使用。
|
|
运行:
|
|
exercise5-15
增加选项-f,使得排序过程不考虑字母大小写之间的区别。例如,比较 a 和 A 时认为它们相等。
|
|
|
|
exercise5-16
增加选项-d(代表目录顺序)。该选项表明,只对字母、数字和空格进行比较。要保证该选项可以和-f 组合在一起使用。
|
|
运行:
|
|
exercise5-18
修改 dcl 程序,使它能够处理输入中的错误。
|
|
运行:
|
|
exercise5-19
修改 undcl 程序,使它在把文字描述转换为声明的过程中不会生成多余的圆括号。
|
|
运行:
|
|
exercise5-20
扩展 dcl 程序的功能,使它能够处理包含其它成分的声明,例如带有函数参数类型的声明、带有类似于 const 限定符的声明等。
|
|