Проблема с этим кодом C - PullRequest
0 голосов
/ 30 августа 2011

Я видел этот код на веб-сайте, и пользователь, который разместил этот код, хотел знать о влияние 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);

Можно ли использовать здесь get (str1) ??

Ответы [ 3 ]

5 голосов
/ 30 августа 2011

Промывка stdin не определяется стандартом и, следовательно, неправильно .Предполагается, что следующее while делает: отменить пользовательский ввод до (и в том числе) \n.

fflush(stdin);/*what does this mean here*/

Никогда нельзя использовать gets, поскольку fgets всегда доступени gets будет удалено из следующей версии стандарта .

Удаление функции gets, не рекомендуемой в текущей редакции стандарта языка C, ISO / IEC 9899:1999 / Cor.3: 2007 (E) в пользу новой безопасной альтернативы получаетони не доступны для записи.Запись в них (через gets или что-либо еще) не определена.

4 голосов
/ 30 августа 2011

Во-первых, fflush из stdin вызывает неопределенное поведение (спасибо Полу Р. за разъяснение).

Во-вторых, вы правы, использование gets с переменной с начальным значением неверно. Во-первых, потому что память, указанная этой переменной, может быть только для чтения (раздел DATA вашей программы, который обычно содержит данные только для чтения); во-вторых, gets может находиться за пределами конца строки, вызывая повреждение памяти (например, перезаписывая другие данные, хранящиеся в разделе DATA, следующем за этой строкой). Наконец, использование gets устарело именно по этой причине: вы не можете ограничить степень чтения строки.

0 голосов
/ 30 августа 2011

Чтобы на самом деле ответить на вопрос, а не обсуждать значение (или его отсутствие) функции fflush () во входном потоке:

Использование gets() никогда не является правильным ни при каких обстоятельствах. Нет никаких шансов гарантировать невозможность избежать переполнения буфера.

Вместо этого вы можете использовать fgets() в качестве почти прямой и гораздо более безопасной альтернативы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...