Как я могу исправить проблему с функцией gets () в C? - PullRequest
1 голос
/ 21 апреля 2020

Проблема с функцией gets. Первый gets, который я пишу, не работает, но следующий приходит правильно.

Я добавил дополнительную функцию gets() в начале, программа просто пропускает ее и получает желаемую строку. Но это не безопасно и надежно. Так в чем же проблема с get и как я могу это исправить?

if (choice == 1) {
  printf("Please enter an English phrase with upper case: ");
  gets(a);
  gets(engphr);
  for (i = 0; engphr[i] != '\0'; i++) {

1 Ответ

0 голосов
/ 21 апреля 2020

Как упоминает Ираклон в своем комментарии, наиболее вероятная причина в том, что у вас есть вызов scanf перед вызовом gets, а завершающий символ новой строки из предыдущего ввода расходуется на gets до того, как у вас появится шанс чтобы ввести что-нибудь еще.

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

if ( fgets( engphr, sizeof engphr, stdin ) ) // assumes engphr is declared as an array, not a pointer
{
  // process engphr
}

Сказав это, вы действительно не должны Смешайте вызовы к scanf и fgets, опять же, потому что scanf оставит завершающие символы новой строки во входном потоке от предыдущих входов, а fgets немедленно вернется после просмотра этой строки. Либо прочитайте все входные данные, используя fgets, и используйте sscanf, чтобы прочитать указанные c элементы из буфера ввода, либо прочитайте все входные данные с помощью scanf.

...