Может кто-нибудь объяснить возвращаемое значение gets() в C?

Я пытаюсь выяснить возвращаемое значение функции gets() в C, но я не понял этого!

Я читал в некоторых книгах: возвращает свой аргумент в случае успеха. NULL-указатель указывает на ошибку или условие конца файла.

Но аргумент является указателем на массив символов. И как я правильно понял, возвращаемое значение также является символом-указателем?

Например:

int main(void)
{
   char text[20];
   char *c = 0;

   printf("Please enter a text: ");
   gets(text);
   printf("Output: %s\n",text);
   printf("Return Value: %p\n",c);

   return 0;
}

Если я наберу "Привет, мир!" я получил в качестве вывода

Выход: привет мир! Возвращаемое значение: 00000000

Если я правильно понял, возвращаемое значение показывает нулевой указатель, что означает ошибку!?

Пожалуйста помоги!

1 ответ

Вы забыли сохранить возвращаемое значение fgets в c, поэтому он печатает все, что было инициализировано.

Возвращаемое значение
В случае успеха функция возвращает str,
Если при попытке прочитать символ обнаружен конец файла, устанавливается индикатор eof (feof). Если это происходит до того, как какие-либо символы могут быть прочитаны, возвращаемый указатель является нулевым указателем (и содержимое str остается неизменным). Если происходит ошибка чтения, индикатор ошибки (ferror) и нулевой указатель также возвращается (но содержимое указывается str возможно, изменился).
( http://www.cplusplus.com/reference/cstdio/gets/)

Фиксированный код показывает, что это работает:

#include <stdio.h>

int main(void)
{
   char text[20];
   char *c = 0;

   printf("Please enter a text: ");
   c = gets(text);
   printf("Output: %s\n",text);
   printf("Return Value: %p\n",c);

   return 0;
}

Результат:

warning: this program uses gets(), which is unsafe.
Please enter a text: hello
Output: hello
Return Value: 0x7fff66df0a30

входящий ^D (EOF в моей ОС; ^Z в некоторых других системах) показывает некоторые случайные символы, потому что массив text содержит неинициализированные данные, и вы все равно их печатаете:

warning: this program uses gets(), which is unsafe.
Please enter a text: Output: &???
Return Value: 0x0

но затем печатает ожидаемое "возвращаемое значение" 0,

(Это предупреждение автоматически вставляется моим компилятором, лязг. Лучше прислушайтесь к нему; вы можете понять, почему оно выдает предупреждение, когда вводите более 18 символов.)

Другие вопросы по тегам