2014-08-31 7 views
2

Так что в основном я изучаю C, и они научили нас использовать функцию gets(), которая обнаружила, что она была удалена и больше не может быть использована. Поэтому я пытаюсь научиться использовать альтернативу, функцию gets_s(), но я не могу показаться. Например, следующий код дает мне «Неопределенная ссылка на gets_s» при попытке скомпилировать .:Неопределенная ссылка на gets_s

char line[21]; 
gets_s(line, 20); 
printf("The line entered was: %s\n", line); 

Много людей сказали использовать fgets() вместо GetS(), но я не понимаю, как это будет работать, так как я хочу прочитать ввод пользователя, а не из файла.

+0

Вам нужно включить заголовок, который определяет 'gets_s'. –

+1

'get_s' доступен только в MSVC. Используйте 'fgets'. –

+1

Даже лучше, используйте 'getline', если ваша система имеет его (как в недавней спецификации Posix). Он динамически выделяет буфер для линии, поэтому может принимать очень большие строки (если позволяют их системные ресурсы). –

ответ

4

Функция gets_s не является первоклассной стандартной функцией. Он реализован Visual Studio (mentioned on MSDN), где он доступен, если вы включили stdio.h.

Интересно C11 вводит его как несколько стандартных функций, упоминая его в добавлении К «Bounds-Checking интерфейсы» наряду с другими _s функциями. Однако многие компиляторы решили не реализовывать этот интерфейс, поэтому, вероятно, лучше не полагаться на него.

Повторим, что user3121023 сказал, fgets, вероятно, самый безопасный путь (но вы должны использовать sizeof, если вы можете):

fgets(line, sizeof line, stdin); 

Примечание Вы не должны пройти один меньше, чем размер массива.

+0

Если вы конвертируете код из MSVC в стандартизованный C, вы можете использовать '#DEFINE gets_s (x, len) fgets ((x), (len) + 1, stdin)' тем временем, пока вы обновляете все ссылки, но Я бы рекомендовал против этого. Простая команда 'sed' будет лучше. –

+0

['get_s'] (http://en.cppreference.com/w/c/io/gets) является частью стандарта C11. –

Смежные вопросы