今天刷题的时候,发现了一个有趣的东西
问题描述
这是一个字符串输入的题目,输入的字符串中是带有空格的,所以关键点就在输入的处理上。
输入样例是这样的
1 | $ 9 |
在第一行输入结束后,缓冲区会残留下一个 \n
,所以我首先使用如下方法进行处理:
1 | char ch;int N; |
这显然是可以工作的,scanf
会忽略行末的\n
;事实也是如此。
但是问题出在了下一行,使用这种方法之后,如果下一行的第一个字符是空格,将不会被getline()
读入。
我在查找资料的过程中并未发现这个问题出现的原因。
实验
换用标准代码中的
1 | cin >> x >> n; |
或者使用
1 | scanf("%c %d",&ch,&N); |
都不会出现这个问题
但是如果使用
1 | scanf("%c %d\n",&ch,&N); |
不但第一个空格会消失,空格之后还会再消失一个有意义字符。
看来\n和那些空格确实是被忽略了。
继续变换了一下输入的数据,第二行第一个有意义字符前面含有多个空格。
1 | scanf("%c %d\n",&ch,&N); |
成功的使得前面这些所有空格都消失了。
总结
按照这个实验结果来看
scanf
中如果使用\n来忽略换行输入,可能会同时忽略之后的空格
还是老老实实的输入然后getchar()
吧