C语言函数scanf中"\n"带来的问题

近日做实验九,有这样一道题:

小鑫の日常系列故事(七)——小纸条
Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description
小鑫在高中的时候喜欢上了一个十分漂亮的女孩。那个女孩也很喜欢他,就答应成为他的女朋友。
但是大家都知道高中的生活是忙碌的,除了上课就是上课,有时候可能连课间时间都被老师占用。于是小鑫想出了在上课给女朋友传纸条的方法来表达自己的爱慕。
又但是她与小鑫之间的距离太远,中间必须通过同学来传递纸条。可他们并不想让同学们知道写的什么就想到加密纸条这种方法。方法如下:
他们每天都会约定加密常数n,举个例子,当n=1时,今天写的每一句话中所用的字母都会向后+1,比如:i love you就成了j mpwf zpv ,当然了当是z的时候,+1就等于a。
请你帮他女朋友解密他写的纸条么?

Input
输入为多组,每组为两行。
第一行为n,-50<n<50
第二行为一句话,只有小写字母和空格。长度小于10000

Output
输出解密之后的内容

Sample Input
1
j mpwf zpv

Sample Output
i love you

起初的代码是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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;
}

但结果却是这样的:
error.jpg

???为啥有换行?一脸懵逼。于是我把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)的用法。

🔰本文标题: C语言函数scanf中"\n"带来的问题

🔞本文链接: https://193.gs/cscanfn/index.html

🌡️本文总热度