3.7 练习
3-1 编写并测试一个函数,逆转字符串中字符的顺序。
3-2 回文是一个单词或词组,不管从前还是从后开始读,结果都是一样的。例如“madam”或“wow”。编写一个程序,接受来自命令行的一个字符串参数,使用在上一个练习(3-1)中编写的函数,打印出这个字符串是否为回文。
3-3 修改在练习3-2中编写的程序,如果位置对称的两个字母大小写不同,仍然使其返回true。例如“Civic”仍会返回true,虽然第一个字母是大写字母。
3-4 修改练习3-3中的程序,使其能够忽略标点符号与空格。例如“Able was I, ere I saw Elba.”也报告true。
3-5 使用下面字符串声明并且只能用char(不能用印刷错误的串或不可思议的数字):
生成下列句子:
3-6 编写一个名为replace的程序,接受3个命令行参数,其中一个参数表示输入的文本文件;一个参数表示被替换掉的字符串(称为from);还有一个表示替换后的字符串(称为to)。此程序应该将一个新文件写到标准输出,并将所有的from被to代替的事件显示出来。
3-7 重写练习3-6,忽略大小写,替换所有from。
3-8 使练习3-3中的程序获得一个来自命令行的文件名,然后显示此文件中所有是回文的单词(忽略大小写)。不要重复显示(即使它们的大小写不同)。所找的回文仅限于单词。(与练习3-4不同。)
3-9 修改HTMLStripper.cpp,使其在遇到一个标记时就显示这个标记的名字。然后还显示在这个标记与相应的结束标记之间的内容。假设无标记的嵌套,并且所有的标记都有结束标记(表示为<TAGNAME>)。
3-10 编写一个程序,采用3个命令行参数(一个文件名和两个字符串)。按照程序开头处的用户输入(用户会选择使用那一种匹配模式),将文件中那些含有两个字符串的行,两个字符串中任意一个字符串的行、只有一个字符串的行、或两个字符串都不含的行,全部显示到屏幕。除了“两个字符串都不含”的情况外,为了突出强调输入的字符串,在每一个显示的字符串的开头与结尾全部标上星号(*)。
3-11 编写一个程序,采用两个命令行参数(一个文件名和一个字符串),计算字符串在文件中出现的次数,包括其作为子串出现的情况(但不计重叠)。例如,输入字符串“ba”将在单词“basketball”中匹配两次,但输入字符串“ana”在单词“banana”中只匹配一次。将字符串在文件中匹配的次数,还有出现字符串的单词的平均长度显示到屏幕。(如果字符串在单词中出现的次数大于1,当计算该单词的平均长度时,只将该单词计算一次。)
3-12 编写一个程序,使用来自命令行的一个文件名,并对字符使用情况进行统计,包括标点符与空格(所有的字符值是从Ox21[33]到Ox7E[126],还包括空格字符)。也就是说,计算每个字符在文件中出现的次数,然后将它们按ASCII排列顺序(空格,然后!,",#,等等),或按用户在程序开始时输入的字符使用频率的升序或降序来显示其结果。对于空格,显示单词“Space”而非单个空字符''。程序运行结果如下所示:
3-13 使用find()和rfind(),编写一个程序。它采用两个命令行参数(一个文件名和一个字符串),显示与该字符串不匹配的第1个和最后一个单词(包括它们的索引值),还有该字符串出现的第一个与最后一个的索引值。当上述任一查找都失败时,显示“Not Found”。
3-14 使用find_first_of函数“族”(但不是惟一的)。编写一个程序,删掉文件中所有非字母数字型的字符(空格与句号除外),然后将句号后的第1个字母大写。
3-15 再次使用find_first_of函数“族”。编写一个程序,将一个文件名用作命令行参数,然后将文件中所有的数字格式化为货币值。忽略第1个十进制小数点与其后第1个非数值型字符之间的所有小数点,将所得数值四舍五入到百分位。例如,字符串12.399abc 29.00.6a(美式转换)将被格式化为$12.40 abc$29.01a。
3-16 编写一个程序,采用两个命令行参数(一个文件名和一个数字),搅乱文件中的每一个单词:随机交换每个单词中的两个字母,交换次数由第2个参数提供。(即,如果从命令行传送到程序中的是0,就不能搅乱单词;如果传送进来的是1,一对随机选择的字母应被交换;如果输入的是2,两对随机选择字母将被交换;以此类推。)
3-17 编写一个程序,从命令行获得一个文件名,显示其中句子的个数(定义为文件中句号的个数)、每个句子中字符的平均个数,还有文件中字符的总个数。
3-18 自行证明,当有越界情况发生时,at()成员函数确实会抛出一个异常,但是索引运算符([])则不会这么做。