鱼C论坛

 找回密码
 立即注册
查看: 1168|回复: 2

[已解决]c语言两个scanf会有”留在缓冲区吗

[复制链接]
发表于 2023-11-3 16:33:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>int main(){int n;int t=0;scanf(“%d”,&n);char arr[n];int i;for(i=0;i<n;i++){scanf(“%c”,&arr[i]);}printf(“%c”,arr[0]);for(i=0;i<n;i++){if(arr[i]=='L'){ t=t+1;}else if(arr[i]=='R'){t=t-1;}}printf(“%d”,t); }
可以观察到,arr[0]并未存入字符,t的数值比预期少1
原因:这种情况通常发生在前面已经有了输入语句,而当前的scanf是在接收字符(即用%c控制输入)时。由于前面的输入语句(不一定是scanf)把最后输入的''遗留在了输入缓冲区,而当前的scanf(“%c”,...);又会把''当一个字符接收,又由于scanf在%c控制下只接收一个字符,所以就不能接收正式输入的字符了。
解决这一问题的最简单办法是在接收字符的scanf的控制符“%c”中的%前加一个空格写成“ %c”,把前一次输入遗留在输入缓冲区里的所有广义空格(' '、'\t'、''等)都吸收掉。在接收字符的scanf前加getchar()等的办法其实是有漏洞的——当缓冲区里只遗留了一个广义字符时可正常工作,若多于一个则同样出错。
请问一下 为啥“留在缓冲区了难道输入的是“”和中间的整形吗
最佳答案
2023-11-3 16:33:49
在这段代码中,输入的第一个整数n会被存储在变量n中,然后会使用一个循环来接收n个字符并存储在数组arr中。但是观察到在接收字符的scanf语句之前,没有使用getchar()或其他方法来清空输入缓冲区。

这会导致问题的根源是,前面的scanf语句在读取整数n后,会将换行符('\n')留在输入缓冲区中。因此,在接收字符的scanf语句中,第一个字符实际上是读取到了之前的换行符,而不是我们期望的字符。

为了解决这个问题,可以在接收字符的scanf语句中,在%c之前添加一个空格,即将控制符写成" %c"。这样做的目的是吸收掉输入缓冲区中的所有空白字符,包括换行符。这样,下一个scanf语句就能正常读取到我们期望的字符了。

需要注意的是,这种情况只会发生在前面的输入语句(不一定是scanf)将最后输入的换行符留在了输入缓冲区中。因此,在接收字符之前,最好使用getchar()或其他方法来清空输入缓冲区,以确保程序的正确执行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-3 16:33:49 | 显示全部楼层    本楼为最佳答案   
在这段代码中,输入的第一个整数n会被存储在变量n中,然后会使用一个循环来接收n个字符并存储在数组arr中。但是观察到在接收字符的scanf语句之前,没有使用getchar()或其他方法来清空输入缓冲区。

这会导致问题的根源是,前面的scanf语句在读取整数n后,会将换行符('\n')留在输入缓冲区中。因此,在接收字符的scanf语句中,第一个字符实际上是读取到了之前的换行符,而不是我们期望的字符。

为了解决这个问题,可以在接收字符的scanf语句中,在%c之前添加一个空格,即将控制符写成" %c"。这样做的目的是吸收掉输入缓冲区中的所有空白字符,包括换行符。这样,下一个scanf语句就能正常读取到我们期望的字符了。

需要注意的是,这种情况只会发生在前面的输入语句(不一定是scanf)将最后输入的换行符留在了输入缓冲区中。因此,在接收字符之前,最好使用getchar()或其他方法来清空输入缓冲区,以确保程序的正确执行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-3 16:51:59 | 显示全部楼层
换行是指回车吗,题目中说的是一个引号在缓冲区
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 00:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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