Я программирую в C в Unix, и я использую gets
считать исходные данные из клавиатуры. Я всегда получаю это предупреждение, и программа прекратите работать:
warning: this program uses gets(), which is unsafe.
Кто-либо может сказать мне причину, почему это происходит?
Как упоминалось в предыдущих ответах, используйте fgets
вместо gets
.
Но это не похоже на то, что получает
вообще не работает, это просто очень-очень небезопасно. Я предполагаю, что в вашем коде есть ошибка, которая также может появиться с fgets
, поэтому, пожалуйста, опубликуйте свой источник.
ИЗМЕНИТЬ Основываясь на обновленной информации, которую вы дали в своем комментарии, у меня есть несколько предложений.
Я рекомендую поискать хорошее учебное пособие по C на вашем родном языке, Google здесь ваш друг. В качестве книги я бы порекомендовал Язык программирования C
. Если у вас есть новая информация, неплохо было бы отредактировать ее в исходном сообщении, особенно если это код, это поможет людям понять, что ты имеешь в виду.
Вы пытаетесь преобразовать строку, в основном массив символов, в один символ, что, конечно же, потерпит неудачу. Вы хотите сделать что-то вроде следующего.
символьное имя пользователя [256];
символьный пароль [256];
scanf ("% s% s", имя пользователя, пароль);
Не стесняйтесь комментировать / редактировать, я очень устарел даже в базовом C.
РЕДАКТИРОВАТЬ 2 Как предупреждал Джеймсдлин, использование scanf
так же опасно, как и
].
gets() является небезопасным. Она принимает один параметр - указатель на буфер char. Спросите себя, насколько большим вы должны сделать этот буфер и как долго пользователь может вводить данные, не нажимая клавишу возврата.
В принципе, нет никакого способа предотвратить переполнение буфера с помощью gets() - используйте fgets().
man gets
говорит:
Никогда не используйте gets (). Потому что это так невозможно сказать, не зная данные заранее, сколько символов gets () будет читать, и потому что gets () продолжит хранить символы за пределами буфера, использовать его крайне опасно. Это был использован для взлома компьютера безопасность. Вместо этого используйте fgets ().
gets
небезопасно, потому что вы даете ему буфер, но не сообщаете, насколько велик буфер. Входные данные могут записывать данные за пределами буфера, что весьма впечатляюще взрывает вашу программу. Вместо этого использовать fgets
немного лучше, потому что вы указываете ему размер буфера, например:
const int bufsize = 4096; /* Or a #define or whatever */
char buffer[bufsize];
fgets(buffer, bufsize, stdin);
... поэтому, если вы дадите ему правильную информацию, он не будет писать после конца буфер и взорвать вещи.
Слегка ОТ, но:
Вам не обязательно использовать const int
для размера буфера, но я бы настоятельно рекомендовал вам не просто использовать буквальное число в обоих местах, потому что вы неизбежно измените одно, но не другое позже. Компилятор может помочь:
char buffer[4096];
fgets(buffer, (sizeof buffer / sizeof buffer[0]), stdin);
Это выражение разрешается во время компиляции, а не во время выполнения. Набирать это неудобно, поэтому я использовал макрос в своем обычном наборе заголовков:
#define ARRAYCOUNT(a) (sizeof a / sizeof a[0])
... но я на несколько лет устаревший с моим чистым C, возможно, в наши дни есть способ получше.