我在网站上看过这段代码,发布此代码的用户想知道
fflush(stdin)
在此代码中的影响。这是下面的代码
main()
{
char *str1="string one";
char *str2="string two";
char charbuf; // store characters in buffer
puts("\nEnter first string");
gets(str1);
fflush(stdin); /*what does this mean here*/
while( (charbuf=getchar() ) != EOF && charbuf!='\n')
; // clear unwanted data
puts("\nEnter second string");
gets(str2);
fflush(stdin);/*what does this mean here*/
while( (charbuf=getchar() ) != EOF && charbuf!='\n')
;
for(;*str1==*str2&(*str1!='\0'||*str2!='\0\);str1++,str2++) ;
{
printf("\nthe string are equal");
}
else
{
printf("\nthe string are not equal");
}
return;
}
但对我来说,在达到fflush(stdin)之前,语句程序员已经犯了一个大错误,即使用get(str1);
可以在这里使用gets(str1)吗?
答案 0 :(得分:5)
Flushing stdin
is undefined by the standard因此错误。它应该执行以下while
:将用户输入丢弃(包括)\n
。
fflush(stdin);/*what does this mean here*/
永远不能使用gets
,因为fgets
始终可用,而gets
将从the next version of the standard中删除。
删除了当前C语言中不推荐使用的gets函数 标准修订版,ISO / IEC 9899:1999 / Cor.3:2007(E),赞成新的 安全的选择,gets_s
显然,由于str1
和str2
指向字符串文字,因此它们不可写。写给他们(通过gets
或其他任何东西)是未定义的。
答案 1 :(得分:4)
首先,fflush
的{{1}}导致未定义的行为(感谢Paul R.澄清)。
其次,你是对的,使用带有初始值的变量的stdin
是不正确的。首先,因为此变量指向的内存可能只是只读(程序的DATA部分,通常包括只读数据);第二,gets
可能超出字符串的结尾,导致内存损坏(例如,覆盖存储在该字符串后面的DATA部分中的其他数据)。最后,由于这个原因,精确地不推荐使用gets
:您不能限制字符串读取的范围。
答案 2 :(得分:0)
实际回答问题,而不是在输入流上讨论fflush()的含义(或缺少):
gets()
的使用在任何情况下都是不正确的。没有机会保证避免缓冲区溢出。
您可以使用fgets()
作为几乎直接且更安全的替代方案。