Может кто-нибудь объяснить возвращаемое значение 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 символов.)