user-0 提问: 关于scanf函数使用的一点困惑

回复:
user: user-1
content: 引用 11 楼 Lucien_zhou的回复:[quote=引用 10 楼 qq_38204686 的回复:] [quote=引用 8 楼 Lucien_zhou的回复:][quote=引用 7 楼 qq_38204686 的回复:] 关于你的第一个例子 输入:第一个字符\n 得到并输出 第一个字符 缓冲区还有 \n  输入:\n第二个字符\n 得到并输出 第二个字符 缓冲区还有\n  s 不会接受\n c 会接受\n 如果第二个输入格式是%c 就直接跳了 你说的这些我是明白的，但你感觉没弄清楚我困惑的地方？我的困惑是，如果按你说的，我两次scanf和printf操作之后，输入缓冲区已经存了两个换行符\n的话，那为什么后面的两次getchar，只有一个getchar取到了缓冲区的换行符，而另一个getchar却要等待键盘输入？[/quote] 前面那个换行符被覆盖了 我前面那一行行的推理下来不就只剩一个/n了么...[/quote] 哦哦，我重新看了下，那第二个输入是：\nxxx\n，但scanf 在输入 %s 的时候不会接受\n，所以scanf接受输入后存储的为 xxx\n，那不就相当于第一个输入的字符串的换行符\n在第二次输入字符串的时候，存储输入的字符串的时候丢弃了?[/quote] 嗯 可以这么说 虽然我不知道它到底是怎么样工作的 但结果就是丢弃 就像我先前发的链接 在有数据之前所有分隔符%s都不会读取 有数据才会读取 直到下一个分隔符 这个时候缓冲区里只有最后那个分隔符了 也就是最后一个回车

user: user-1
content: 引用 11 楼 Lucien_zhou的回复:[quote=引用 10 楼 qq_38204686 的回复:] [quote=引用 8 楼 Lucien_zhou的回复:][quote=引用 7 楼 qq_38204686 的回复:] 关于你的第一个例子 输入:第一个字符\n 得到并输出 第一个字符 缓冲区还有 \n  输入:\n第二个字符\n 得到并输出 第二个字符 缓冲区还有\n  s 不会接受\n c 会接受\n 如果第二个输入格式是%c 就直接跳了 你说的这些我是明白的，但你感觉没弄清楚我困惑的地方？我的困惑是，如果按你说的，我两次scanf和printf操作之后，输入缓冲区已经存了两个换行符\n的话，那为什么后面的两次getchar，只有一个getchar取到了缓冲区的换行符，而另一个getchar却要等待键盘输入？[/quote] 前面那个换行符被覆盖了 我前面那一行行的推理下来不就只剩一个/n了么...[/quote] 哦哦，我重新看了下，那第二个输入是：\nxxx\n，但scanf 在输入 %s 的时候不会接受\n，所以scanf接受输入后存储的为 xxx\n，那不就相当于第一个输入的字符串的换行符\n在第二次输入字符串的时候，存储输入的字符串的时候丢弃了?[/quote] 嗯 可以这么说 虽然我不知道它到底是怎么样工作的 但结果就是丢弃 就像我先前发的链接 在有数据之前所有分隔符%s都不会读取 有数据才会读取 直到下一个分隔符 这个时候缓冲区里只有最后那个分隔符了 也就是最后一个回车

user: user-0
content: http://blog.csdn.net/weiweicsdn1/article/details/52185453 谢谢楼上的各位，scanf还有一个特性，就是忽略先导的空白符。不管是有几百个回车也好，几万个空格也罢，只要它们连续地出现在缓冲区的开头，就统统忽略他们。

user: user-0
content: 引用 10 楼 qq_38204686 的回复:[quote=引用 8 楼 Lucien_zhou的回复:][quote=引用 7 楼 qq_38204686 的回复:] 关于你的第一个例子 输入:第一个字符\n 得到并输出 第一个字符 缓冲区还有 \n  输入:\n第二个字符\n 得到并输出 第二个字符 缓冲区还有\n  s 不会接受\n c 会接受\n 如果第二个输入格式是%c 就直接跳了 你说的这些我是明白的，但你感觉没弄清楚我困惑的地方？我的困惑是，如果按你说的，我两次scanf和printf操作之后，输入缓冲区已经存了两个换行符\n的话，那为什么后面的两次getchar，只有一个getchar取到了缓冲区的换行符，而另一个getchar却要等待键盘输入？[/quote] 前面那个换行符被覆盖了 我前面那一行行的推理下来不就只剩一个/n了么...[/quote] 哦哦，我重新看了下，那第二个输入是：\nxxx\n，但scanf 在输入 %s 的时候不会接受\n，所以scanf接受输入后存储的为 xxx\n，那不就相当于第一个输入的字符串的换行符\n在第二次输入字符串的时候，存储输入的字符串的时候丢弃了?

user: user-1
content: 引用 8 楼 Lucien_zhou的回复:[quote=引用 7 楼 qq_38204686 的回复:] 关于你的第一个例子 输入:第一个字符\n 得到并输出 第一个字符 缓冲区还有 \n  输入:\n第二个字符\n 得到并输出 第二个字符 缓冲区还有\n  s 不会接受\n c 会接受\n 如果第二个输入格式是%c 就直接跳了 你说的这些我是明白的，但你感觉没弄清楚我困惑的地方？我的困惑是，如果按你说的，我两次scanf和printf操作之后，输入缓冲区已经存了两个换行符\n的话，那为什么后面的两次getchar，只有一个getchar取到了缓冲区的换行符，而另一个getchar却要等待键盘输入？[/quote] 前面那个换行符被覆盖了 我前面那一行行的推理下来不就只剩一个/n了么...

user: user-0
content: 第一个例子中的测试用例中两次scanf 以及printf 之后，getchar 获取了一次换行符\n，我让它输出了，为10，但后面的第二个getchar函数是在等待键盘输入的，我用ctrl+c退出了

user: user-0
content: 引用 7 楼 qq_38204686 的回复:关于你的第一个例子 输入:第一个字符\n 得到并输出 第一个字符 缓冲区还有 \n  输入:\n第二个字符\n 得到并输出 第二个字符 缓冲区还有\n  s 不会接受\n c 会接受\n 如果第二个输入格式是%c 就直接跳了 你说的这些我是明白的，但你感觉没弄清楚我困惑的地方？我的困惑是，如果按你说的，我两次scanf和printf操作之后，输入缓冲区已经存了两个换行符\n的话，那为什么后面的两次getchar，只有一个getchar取到了缓冲区的换行符，而另一个getchar却要等待键盘输入？

user: user-1
content: 关于你的第一个例子 输入:第一个字符\n 得到并输出 第一个字符 缓冲区还有 \n  输入:\n第二个字符\n 得到并输出 第二个字符 缓冲区还有\n  s 不会接受\n c 会接受\n 如果第二个输入格式是%c 就直接跳了

user: user-0
content: 引用 5 楼 Lucien_zhou 的回复:[quote=引用 3 楼 qq_38204686 的回复:] [quote=引用 2 楼 Lucien_zhou的回复:]可是如果scanf把\n留在输入缓冲区，那我输入两次，缓冲区里不就应该有两个\n，可我自己的第一个例子里，在输入输出两次后，我用了两个getchar，根据测试结果看，缓冲区里应该只有一个\n，这个也是我困惑的。 缓冲区里有的 %s 读入的时候分隔符不读入 所以你误以为没有 你这俩例子不是证明了么[/quote] 不对的，以我自己的第一个例子来看，我在scanf 输入一次，printf输出一次，然后再scanf输入一次，printf 输出一次，这两次操作之后，我使用了两个getchar ，只有一个getchar获取到了回车符，第二个getchar是在等待键盘输入，那如果输入缓冲区内有两个回车符为什么第二个getchar 是需要从键盘输入？[/quote] 我的表述有误，因为就像你给的链接一样，我两次回车，存储的是换行符\n，而不是回车\r\n，但我困惑于到底我的第一个例子中输入缓冲区中有几个换行符？测试用例看应该是一个，不然第二个为什么从键盘输入？

user: user-0
content: 引用 3 楼 qq_38204686 的回复:[quote=引用 2 楼 Lucien_zhou的回复:]可是如果scanf把\n留在输入缓冲区，那我输入两次，缓冲区里不就应该有两个\n，可我自己的第一个例子里，在输入输出两次后，我用了两个getchar，根据测试结果看，缓冲区里应该只有一个\n，这个也是我困惑的。 缓冲区里有的 %s 读入的时候分隔符不读入 所以你误以为没有 你这俩例子不是证明了么[/quote] 不对的，以我自己的第一个例子来看，我在scanf 输入一次，printf输出一次，然后再scanf输入一次，printf 输出一次，这两次操作之后，我使用了两个getchar ，只有一个getchar获取到了回车符，第二个getchar是在等待键盘输入，那如果输入缓冲区内有两个回车符为什么第二个getchar 是需要从键盘输入？

user: user-1
content: http://www.360doc.com/content/15/0803/21/21172899_489310154.shtml

user: user-1
content: 引用 2 楼 Lucien_zhou的回复:可是如果scanf把\n留在输入缓冲区，那我输入两次，缓冲区里不就应该有两个\n，可我自己的第一个例子里，在输入输出两次后，我用了两个getchar，根据测试结果看，缓冲区里应该只有一个\n，这个也是我困惑的。 缓冲区里有的 %s 读入的时候分隔符不读入 所以你误以为没有 你这俩例子不是证明了么

user: user-0
content: 可是如果scanf把\n留在输入缓冲区，那我输入两次，缓冲区里不就应该有两个\n，可我自己的第一个例子里，在输入输出两次后，我用了两个getchar，根据测试结果看，缓冲区里应该只有一个\n，这个也是我困惑的。

user: user-2
content: scanf并不会把\n丢弃，在执行前两句时候输入字符串，并回显没问题，但是scanf把\n留在缓冲区，下一个getchar把\n读取并以十进制打印