关于C语言中scanf函数换行符\n的读取问题概论

您所在的位置:网站首页 c语言里换行符 关于C语言中scanf函数换行符\n的读取问题概论

关于C语言中scanf函数换行符\n的读取问题概论

2024-07-10 20:37| 来源: 网络整理| 查看: 265

首先针对于scanf函数能否读取换行\n这个问题

我们需要区分不同情况展开讨论

1.如果我们读取的是数字类型 

单纯根据上述程序内容,我们需要输入一个数字 并且赋值给 整型变量 a,然后输入字符并且赋值给c。(最后一行打错了应该是printf(”%d\n%c\n“,a,c))

我们不妨输入格式为

5

z(就是一个数字5加换行加一个字母c)

这个时候输出的结果就是

前两个5z是我输入的结果,可以看到,虽然我有输入换行符,但是却并没有被第二个 scanf函数读取并且赋值给字符变量c

在scanf函数中,如果输入的%d,那么你的输入换行符 (空格也是)会直接被当作结束符号,作为你结束输入的标志。并且这个标志不会被下一个读取字符函数所读取!

可以看到就算我在首行scanf函数里面输入了换行\n变成while(~scanf("%d\n ",&a))输出的结果仍然不受任何影响。 

2.如果前一个输入函数的格式里面是字符

这个时候情况就不能相提并论了!

 我们输入的格式是 

z

z(就是一个数字5加换行加一个字母c)

但是结果跟上图所示,我们还没来得及输入第二个字符z,程序就输出结果了!

原因是对于 scanf("%c",&d);这种输入格式,他是可以读取换行符的!虽然换行符同样 作为scanf("%c",&d);输入结束的标志, 但是由于换行符本身也是一种字符,所以他会被作为结束第一个scanf标志的同时被第二个scanf读取,最后直接输出结果。

解决这种情况的方法有很多种

(1)我们在一个scanf函数末尾加入一个\N

 这个时候我们的输出格式和内容就达到我们理想的预期了

原因是此时 \N也即是我们输入的换行符被作为一个scanf的读取格式输入了,这样换行符就任然会作为第一个scanf函数的结束标志,而第二个scanf的开始标志是输入的第一个非\n(非换行符)的字符。

 至此得到一个非常重要的结论

scanf("%c\n",&c),这种在scanf函数末尾加入\n的形式,会把下一个scanf函数输入开始标志百分百变成非换行符的字符

也就是说我们在输入第二个z之前无论输入多少个换行符,都不会影响输入。

红色的框是我的输入部分,可以看到中间的换行符都不会被识别成第二个输入函数的字符了

(2)在第二个scanf前面加入一个\N

 

 

这两个完全是一模一样的效果,不多赘述,同上。

(3)在第二个scanf前面加入一个getchar();

getchar函数的作用是读取一个字符,当然也包括了换行符,

我们同样以

z

z

作为输入格式,可以得到下图的结果

不同于前两个的是,getchar只能读取一个换行符

所以我输入

z

z(z加换行符加换行符加z)就不能达到预期的效果

输入第二个换行符的时候就输出了

这个时候就要根据你输入的格式里有几个换行符 添加相应数量的getchar了

比如我这边输入两个换行符

我加两个getchar就能达到预期效果了

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3