C语言函数scanf中"\n"带来的问题
近日做实验九,有这样一道题:
小鑫の日常系列故事(七)——小纸条
Time Limit: 1000 ms Memory Limit: 65536 KiBProblem Description
小鑫在高中的时候喜欢上了一个十分漂亮的女孩。那个女孩也很喜欢他,就答应成为他的女朋友。
但是大家都知道高中的生活是忙碌的,除了上课就是上课,有时候可能连课间时间都被老师占用。于是小鑫想出了在上课给女朋友传纸条的方法来表达自己的爱慕。
又但是她与小鑫之间的距离太远,中间必须通过同学来传递纸条。可他们并不想让同学们知道写的什么就想到加密纸条这种方法。方法如下:
他们每天都会约定加密常数n,举个例子,当n=1时,今天写的每一句话中所用的字母都会向后+1,比如:i love you就成了j mpwf zpv ,当然了当是z的时候,+1就等于a。
请你帮他女朋友解密他写的纸条么?Input
输入为多组,每组为两行。
第一行为n,-50<n<50
第二行为一句话,只有小写字母和空格。长度小于10000Output
输出解密之后的内容Sample Input
1
j mpwf zpvSample Output
i love you
起初的代码是这样的:
1 |
|
但结果却是这样的:
???为啥有换行?一脸懵逼。于是我把scanf("%d",&n)
改成了scanf("%d\n",&n)
,看样子结果是对的,但OJ给出了Presentation Error的错误,格式不正确。
经过一番搜索,网络上有人在scanf("%d",&n)
下面加了一句getchar()
。经过改进,成功AC。但为什么呢?
因为scanf在读取字符串时,会自动忽略换行符,但是换行符还是留在缓冲区中。加一句
getchar()
就可以“吃掉”换行符,接受换行符。一般情况是不需要加getchar()
的,但后面需要输入字符串时需要。
那为什么不能使用scanf("%d\n",&n)
呢?
因为在scanf中 “n” 不是表示接受一个回车符,而是表示忽略所有的空白字符(包括回车,空格,tab )。
所以在日常的编程中尽量不要使用scanf("%d\n",&n)
的用法。