C语言中gets()函数和清空缓冲区问问题 5

#include<stdio.h>intmain(){charstr4[100];scanf("%*[^\n]");scanf("%*c");gets(str4);pri... #include<stdio.h>
int main()
{
char str4[100];
scanf("%*[^\n]");
scanf("%*c");
gets(str4);
printf("%s\n", str4);
return 0;
}
为什么次程序要输入两次字符串;
如:输入一个abc回车,没反映,再输入def回车,显示def。
求解
展开
 我来答
an0011121
推荐于2017-09-04 · TA获得超过1.1万个赞
知道大有可为答主
回答量:3948
采纳率:55%
帮助的人:2349万
展开全部
scanf("%*[^\n]");
^取反或者“非”,[^\n]就是除了回车什么都可以被scanf读到。*表示被读到了但是不把读到值或者字符赋值给任何变量。
%*[^\n]就是读取来自键盘的出去回车外的任意字符,并不赋值给变量。
scanf("%*c");
就一个*,和上边表示一样就是读到了不赋值给任何变量。

再看,scanf("%[^\n]%*c",str)读入一行字符,赋值给str变量。如果c前面没有*,那么就需要str后面再写一个char类型的ch。这就告诉你*表示读到了但是不赋值给任何变量。
那么scanf("%*[^\n]%*c")这句话,应该能理解吧,两个格式控制符里面都有*,就是都读到了都不赋值变量。

读到这里你应该差不多理解了,就是你的题中的两句scanf(相当于scanf("%*[^\n]%*c"))读到了你输入的abc,但是没有赋值给任何变量。然后到了gets(str4);读到了def赋值给str4,然后printf("%s\n", str4);后必然显示def。

清空缓存区用fflush(stdin);这句代码。
键盘输入的东西都是放在缓冲区的这款区域,有变量过来了就带走,没有变量就在那里呆着等待一个变量来带它走。但是这个时候缓冲区里面偶尔会有一些垃圾的字符,而影响了正常的输入,有的时候用getchar()带走一个两个的字符,但是如果还是不见效一句fflush(stdin);就可以了。
White_MouseYBZ
2013-02-13 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6527万
展开全部
scanf("%*[^\n]");接收除'\n'的任何字符,但不赋给任何变量。当你输入一个字符回车时就执行下一条语句scanf("%*c");了。这条语句是读一个字符不赋给任何变量,你刚才输入的'\n'就被它读取了,所以又顺序执行下面的gets(str4);了。
综上,其实不是要输入abc'\n'def'\n'才输出def,而是前面无论输入多少字符都无关,关键是要输入一个'\n'。你可以试试……
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式