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

温馨提示:本文最后修改于 335 天前,部分内容可能已经过时。如文章内容或静态资源失效,请联系我进行更新,谢谢~

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

小鑫の日常系列故事(七)——小纸条
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

起初的代码是这样的:

#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.png

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

~~End Of File~~

本文永久链接:https://blog.xmgspace.me/archives/c-scanf.html

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

本站欢迎转载与引用~但您需要注明文章标题与链接,并表明转载/引用自Xiaomage's Blog。

授权协议:署名-非商业性使用-相同方式共享 4.0 国际(CC BY 4.0)

标签:C语言学习

还没有人评论哦,还不快抢沙发~

添加新评论

i_f01.pngi_f02.pngi_f03.pngi_f04.pngi_f05.pngi_f06.pngi_f07.pngi_f08.pngi_f09.pngi_f10.pngi_f11.pngi_f12.pngi_f13.pngi_f14.pngi_f15.pngi_f16.pngi_f17.pngi_f18.pngi_f19.pngi_f20.pngi_f21.pngi_f22.pngi_f23.pngi_f24.pngi_f25.pngi_f26.pngi_f27.pngi_f28.pngi_f29.pngi_f30.pngi_f31.pngi_f32.pngi_f33.png