题目:编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格替代
自我解答:
#includeint main() { int c; char c_before = 'a'; while((c = getchar()) != EOF) { if(c == ' ' && c_before == ' ') continue; putchar(c); c_before = c; } }
实现思路:用一个变量纪录前一个字符,当前面一个字符和目前字符都是空格时,进入下一次循环,否则输出这个字符。
注意:初始化c_before为非空格的任何一个字符,如果其为空格字符,那么当输入为多个空格的情况将不会打印一个空格出来。
运行结果
Hello world! Hello world!
输入为“ Hello world! ”
补充(2021.10.13):
逻辑判断 c == ' ' && c_before == ' '的取反的结果是 c != ' ' || c_before != ' ' 所以上述语句可以简化为:
if( c != ' ' || c_before != ' ')
putchar(c);
参考答案:
#include#define NonBLANK 'a' int main() { int c, lastc; lastc = NONBLANK; while((c = getchar()) != EOF) { if(c != ' ') putchar(c); if(c == ' ') if(lastc != ' ') putchar(c); lastc = c; } return 0; }
整形变量c负责记录当前输入字符的ASCII值,而整形变量lastc则记录着前一个输入字符的ASCII值。符号常量NONBLANK负责把变量lastc初始化为一个任意的非空格字符。
while循环体中的第一条if语句输出非空格字符;第二条if语句处理空格字符,而第三条if语句用于检查当前的空格字符究竟是一个单一的空格还是一串空格中的第一个空格。最后对变量lastc进行刷新。以上 *** 作将一直重复到while循环终止(即getchar返回EOF为止)
对if-else语句的介绍最早出现于教材第14页,下面是使用了这一语法结构的实现方法:
#include#define NonBLANK 'a' int main() { int c, lastc; lastc = NONBLANK; while((c = getchar()) != EOF) { if(c != ' ') putchar(c); else if(lastc != ' ') putchar(c); lastc = c; } return 0; }
对逻辑或(OR) *** 作符||的介绍最早出现于教材第14页,下面是使用了这一知识的实现方法:
#include#define NonBLANK 'a' int main() { int c, lastc; lastc = NONBLANK; while((c = getchar()) != EOF) { if(c != ' ' || lastc != ' ') putchar(c); lastc = c; } return 0; }
补充
参考答案中的最后用逻辑或的形式和自我解答中的原理是一样的,本人认为自我解答中的逻辑上更好理解一些。
参考答案中的三个层次逐次递进,有了最后最简洁的形式。这种逻辑上逐次递进是在处理大型问题时值得借鉴的方法。
自我解答中的关于英文命名变量的准确度还有待提高,例如上次一个字符用lastc而不是beforec,空格的英文为blank,而不是space。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)