这个C代码有问题

时间:2011-08-30 10:23:12

标签: c

我在网站上看过这段代码,发布此代码的用户想知道 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)吗?

3 个答案:

答案 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

修改

显然,由于str1str2指向字符串文字,因此它们不可写。写给他们(通过gets或其他任何东西)是未定义的。

答案 1 :(得分:4)

首先,fflush的{​​{1}}导致未定义的行为(感谢Paul R.澄清)。

其次,你是对的,使用带有初始值的变量的stdin是不正确的。首先,因为此变量指向的内存可能只是只读(程序的DATA部分,通常包括只读数据);第二,gets可能超出字符串的结尾,导致内存损坏(例如,覆盖存储在该字符串后面的DATA部分中的其他数据)。最后,由于这个原因,精确地不推荐使用gets:您不能限制字符串读取的范围。

答案 2 :(得分:0)

实际回答问题,而不是在输入流上讨论fflush()的含义(或缺少):

gets()的使用在任何情况下都是不正确的。没有机会保证避免缓冲区溢出。

您可以使用fgets()作为几乎直接且更安全的替代方案。