0%

疑点笔记

今天刷题的时候,发现了一个有趣的东西

问题描述

这是一个字符串输入的题目,输入的字符串中是带有空格的,所以关键点就在输入的处理上。

输入样例是这样的

1
2
3
4
5
6
7
8
9
10
$ 9
@ @@@@@
@@@ @@@
@ @ @
@@@ @@@
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@
@ @ @ @
@ @@@@@

在第一行输入结束后,缓冲区会残留下一个 \n,所以我首先使用如下方法进行处理:

1
2
char ch;int N;
scanf("%c %d\n",&ch,&N);

这显然是可以工作的,scanf会忽略行末的\n;事实也是如此。

但是问题出在了下一行,使用这种方法之后,如果下一行的第一个字符是空格,将不会被getline()读入。

我在查找资料的过程中并未发现这个问题出现的原因。

实验

换用标准代码中的

1
2
cin >> x >> n;
getchar();

或者使用

1
2
scanf("%c %d",&ch,&N);
getchar();

都不会出现这个问题

但是如果使用

1
2
3
scanf("%c %d\n",&ch,&N);

getchar();

不但第一个空格会消失,空格之后还会再消失一个有意义字符。

看来\n和那些空格确实是被忽略了。

继续变换了一下输入的数据,第二行第一个有意义字符前面含有多个空格。

1
scanf("%c %d\n",&ch,&N);

成功的使得前面这些所有空格都消失了。

总结

按照这个实验结果来看

scanf中如果使用\n来忽略换行输入,可能会同时忽略之后的空格

还是老老实实的输入然后getchar()

-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道