cs宇帝 发表于 2023-11-3 16:33:43

c语言两个scanf会有”留在缓冲区吗

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

isdkz 发表于 2023-11-3 16:33:49

在这段代码中,输入的第一个整数n会被存储在变量n中,然后会使用一个循环来接收n个字符并存储在数组arr中。但是观察到在接收字符的scanf语句之前,没有使用getchar()或其他方法来清空输入缓冲区。

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

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

需要注意的是,这种情况只会发生在前面的输入语句(不一定是scanf)将最后输入的换行符留在了输入缓冲区中。因此,在接收字符之前,最好使用getchar()或其他方法来清空输入缓冲区,以确保程序的正确执行。

cs宇帝 发表于 2023-11-3 16:51:59

换行是指回车吗,题目中说的是一个引号在缓冲区
页: [1]
查看完整版本: c语言两个scanf会有”留在缓冲区吗