近日做实验九,有这样一道题:
小鑫の日常系列故事(七)——小纸条
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
起初的代码是这样的:
#include<stdio.h>
#include<string.h>
int main()
{
int n,i,j,k,m;
char s[10000];
while (scanf("%d",&n)!=EOF)
{
gets(s);
k=n%26;
for(i=0;s[i]!='\0';i++)
{
if(s[i]==' ')
continue;
else
{
m=s[i]-k;
if(m<'a')
s[i]=122+1-(97-m);
else if(m>'z')
s[i]=97-1+(m-122);
else s[i]=m;
}
}
puts(s) ;
}
return 0;
}
但结果却是这样的:
???为啥有换行?一脸懵逼。于是我把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)
的用法。