首先针对于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就能达到预期效果了