鱼C论坛

 找回密码
 立即注册
查看: 2720|回复: 8

C语言scanf录入字符,字符串

[复制链接]
发表于 2023-3-23 13:39:49 | 显示全部楼层
问题的关键在于scanf的使用方式和字符串格式化输入的处理。

在第一个代码示例中,当你使用scanf("%c", &b)时,scanf会读取缓冲区中的下一个字符,而这个字符正好是第一次输入字符串时的回车符(换行符)。换行符会被立即读取并赋值给b,这就是为什么没有等待你输入新的字符。

在第二个代码示例中,你使用了scanf("%s", &b)。%s表示字符串输入,这里的关键区别在于字符串输入格式化会自动跳过缓冲区中的空格、制表符和换行符。所以当第二次调用scanf时,它会自动忽略缓冲区中的换行符,然后等待你输入新的字符串。当你输入"bbb"并按回车后,这个新的字符串就被赋值给b。此时,换行符在第二次scanf时已经被忽略了,因此在输出时也不会显示出来。

总结一下,当使用%c格式化输入时,scanf会立即读取缓冲区中的下一个字符,包括换行符;而当使用%s格式化输入时,scanf会自动跳过空格、制表符和换行符,直到遇到有效的字符输入。这就是为什么在第二个示例中,即使缓冲区中有换行符,也能正常输入字符串。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-23 14:00:56 | 显示全部楼层
gudanbeiying 发表于 2023-3-23 13:58
懂了懂了,我还想问就是,我在做PAT考试题的时候,在我用scanf录入了一个整型变量的前提下比如 5回车,然 ...

在PAT考试题中,这个问题可能是由于缓冲区处理和输入格式的不同要求导致的。当你使用scanf读取一个整型变量后,缓冲区中的换行符没有被消耗,所以下一个scanf读取字符串时可能会受到影响。虽然scanf("%s")会自动跳过空格、制表符和换行符,但在实际评测环境中,输入和换行符的处理可能有所不同,这可能导致了你的解答没有得到满分。

当你使用getchar()清空缓冲区后再使用gets()读取字符串,你手动处理了缓冲区中的换行符。这样可以确保在读取字符串时,不会受到先前输入整数时留在缓冲区的换行符的影响。因此,这个解决方案在评测系统中可以得到满分。

在实际编程中,为了避免类似问题,你可以在需要的时候使用getchar()或者其他方法清空缓冲区。这可以确保你的输入不会受到先前输入遗留在缓冲区的字符的影响。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-25 03:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表