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。
求解 展开
int main()
{
char str4[100];
scanf("%*[^\n]");
scanf("%*c");
gets(str4);
printf("%s\n", str4);
return 0;
}
为什么次程序要输入两次字符串;
如:输入一个abc回车,没反映,再输入def回车,显示def。
求解 展开
2个回答
展开全部
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);就可以了。
^取反或者“非”,[^\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);就可以了。
展开全部
scanf("%*[^\n]");接收除'\n'的任何字符,但不赋给任何变量。当你输入一个字符回车时就执行下一条语句scanf("%*c");了。这条语句是读一个字符不赋给任何变量,你刚才输入的'\n'就被它读取了,所以又顺序执行下面的gets(str4);了。
综上,其实不是要输入abc'\n'def'\n'才输出def,而是前面无论输入多少字符都无关,关键是要输入一个'\n'。你可以试试……
综上,其实不是要输入abc'\n'def'\n'才输出def,而是前面无论输入多少字符都无关,关键是要输入一个'\n'。你可以试试……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询