如果任一解决方案在您的程序必须运行的系统上行不通,则最佳的解决方案是将 的工
作版本与您的代码放置在一个包中。可以找到以 归档格式的、自由使用的版本;请参阅 参考
资料。
继续, scanf 系列的函数也设计得很差。在这种情况下,目的地缓冲区会发生溢出。考虑以下代码:
+22
FG
+;?;+H
!
如果输入的字大于 的大小,则有溢出的情况。幸运的是,有一种简便的方法可以解决这个问题。考虑以下代
码,它没有安全性方面的薄弱环节:
+22
FG
+;?FF;+H
!
百分号和 之间的 FF指定了实际存储在变量 中来自 的字符不会超过 FF个。其
余匹配的字符将不会被复制。
接下来,我们讨论 streadd()和 strecpy()。由于,不是每台机器开始就有这些调用,那些有这些函数
的程序员,在使用它们时,应该小心。这些函数可以将那些含有不可读字符的字符串转换成可打印的表示。例如,
考虑以下程序:
",B,5-
+22
+;88;+;;
?8;+
!
该程序打印:
88
而不是打印所有空白。如果程序员没有预料到需要 多大的输出缓冲区来处理输入缓冲区(不发生
缓冲区溢出),则 和 函数可能有问题。如果输入缓冲区包含单一字符 ― 假
设是 9'(((,69)― 则它将打印成四个字符“8。这是字符串增长的最坏情况。
如果没有分配足够的空间,以至于输出缓冲区的大小总是输入缓冲区大小的四倍,则可能发生缓
冲区溢出。
另一个较少使用的函数是 strtrns(),因为许多机器上没有该函 数。函数 取三个字符串和结果字
符串应该放在其内的一个缓冲区,作为其自变量。第一个字符串必须复制到该缓冲区。一个字符被从第一个字符