源自《The C Programming Language》P22 pr1-18:
编写一个程序,删除每个输入行末尾的空格,制表符,并删除完全是空格的行
代码:
分析:
1, 针对输入的字符串(line)的倒数第二个字符是否为'/n',分情况进行消除字符串末尾的空格及制表符处理。
2, 针对处理后的字符串(post_line[n])的倒数第二个字符是否为'/n',在打印的时候分情况进行处理。
3, getLine函数:读入一行字符后,将输入缓冲区清空,这样当超过字符数组line的界限的字符会被清除掉,
如果不清空,则在下次调用getLine函数时,上次超出的字符部分会被getchar函数直接
读到这次的line字符数组中,造成混乱。
参考代码:
分析:
1, 对比于自己实现的代码,发现这段代码简洁多了,思路也很清晰和易懂。
2, 有点缺憾之处:(a),每次输入一行字符,处理结果会紧接着下一行输出,不太容易观看,
而上面那段代码就不存在这个问题。
(b),参考代码没有考虑一行字符串没有'/n'的情况,这和它将MAXLINE设成1000有关,
极端的情况是一个字符串就是1000个字符,并且倒数第二字符不是'/n',如果MAXLINE
的值比较小的话,这个问题就凸现出来了,相比于此,上段代码考虑了这种情况。
修改remove函数:
while(s[i] != '/n' && i < MAXLINE - 2)
++i;
if(i != MAXLINE - 2)
--i;
while(i >= 0 && (s[i] == ' ' || s[i] == '/t'))
--i;
if( i >= 0 && i < MAXLINE - 2)
{
++i;
s[i] = '/n';
++i;
s[i] = '/0';
}