本章问题
1.C语言缺少显示的字符串数据类型,这是一个优点还是一个缺点?
answer:
(这个问题存在争论(尽管我有一个结论))目前这个方法的优点是字符数组的效率和访问的灵活性,它的缺点是有可能引起错误,数组溢出,下标越界,不能改变任何用于保存字符串的数组的长度等。我的结论是从现代的面向对象的奇数引出的,字符串类毫无例外的包括了完整的错误检查,用于字符串的动态内存分配和其他一些防护措施,这些措施都会造成效率上的损失,但是,如果程序无法运行,效率再高也没有什么意义,况且,现在软件项目的规模比设计C语言的时代要大得多。因此,在数年前,缺少显示的字符串类型还能被看成是一个优点,但是,由于这个方法内在的危险性,所以使用现代的高级的完整的字符串类还是物有所值的,如果C程序员愿意循规蹈矩的使用字符串也可以获得这些优点。
2.strlen函数返回一个无符号量(size_t),为什么这里无符号值比有符号值更合适?但返回无符号值其实也有缺点,为什么?
answer:It is more appropriate because the length of a string simply annot be vegative,Also,using an unsigned value allows longer string lengths(which would be negative in a signed quantity)to be represented.It is less appropriate becuase arithmetic involving unsinged expressions can yield unexpected results,The "advantage" of being able to report the length of longer strings is only rarely of value:on machines with 16 bit integers,it is needed only for strings exceeding 2147483647 bytes in length(which is rare indeed).
(更合适是因为一个字符串的长度不可能是个负数,而且无符号数的值允许字符串的长度更长,不适合是因为牵涉到算术运算时无符号表达四可能产生无法预料的结果,能够允许字符串的长度更长这个“优点”其实很少使用,因为在16位机器上的整型,可以有2147483647位的长度,但实际很少使用)
3.如果strcat和strcpy返回一个指向目标字符串末尾的指针,和事实上返回一个指向目标字符串起始位置的指针相比,有没有什么优点?
answer:Yes,then subsequent concatenations could be done more efficiently because the work of finding the end of the string would not need to be repeated.
(是的,指向目标字符串末尾的指针更高效,因为找到字符串的末尾的指针不需要重复工作)
4.如果从数组x复制50个字节到数组y,最简单的方法是什么?
answer:
(使用memory库函数,重要的是不要使用任何的str--函数,因为它们会在遇见第一个NUL字节的时候停止,如果你自己写一个循环要更复杂,而且在效率上几乎不可能超过这个函数)
5.假定你有一个名叫buffer的数组,它的长度为BSIZE个字节,你用下面这条语句把一个字符串复制到这个数组:
strncpy( buffer, some_other_string,BSIZE-1);
它能不能保证buffer中的内容是个有效的字符串?
answer:Only if the last character in the array is already NUL,A string must be terminated with a NUL byte,and strncpy does not guarantee that this will occur,However,the statement does not let strncpy change the last position in the array,so if that contains a NUL byte(either through an assignment or by the default initialization of static variables),then the result will be a string.
(只有字符 数组的最后一个字符确实是NUL的时候,一个字符串必须以NUL字节结尾,strncpy不会检查有效性,然而,语句不会让strncpy改变数组的最后一个位置,所以如果 最后一个位置是NUL字节(通过一个赋值或默认静态变量的初始化),它的结果将会是个字符串
6.用下面这种方法
if(isalpha(ch))
取代下面这种显式的测试有什么优点?
answer:First,the former will work regardless of the character set in use,The latter will work with the ASCII character set but will fail with the EBCDIC character set,Second,the former will work properly whether or not the locale has been changed;the latter may not.
(首先,前者不管在什么字符集中都能工作,而后者只能工作运行在ASCII字符集中,而在EBCDIC编码中不能使用,第二,不管字母的区域是否改变前者都能正常运行,而后者不能)
7.下面的代码怎样简化?
for(p_str = message; *p_str != '