то, почему добирается () не работает?

Я программирую в C в Unix, и я использую gets считать исходные данные из клавиатуры. Я всегда получаю это предупреждение, и программа прекратите работать:

warning: this program uses gets(), which is unsafe.

Кто-либо может сказать мне причину, почему это происходит?

10
задан Donal Fellows 4 June 2010 в 12:38
поделиться

4 ответа

Как упоминалось в предыдущих ответах, используйте fgets вместо gets .

Но это не похоже на то, что получает вообще не работает, это просто очень-очень небезопасно. Я предполагаю, что в вашем коде есть ошибка, которая также может появиться с fgets , поэтому, пожалуйста, опубликуйте свой источник.

ИЗМЕНИТЬ Основываясь на обновленной информации, которую вы дали в своем комментарии, у меня есть несколько предложений.

  • Я рекомендую поискать хорошее учебное пособие по C на вашем родном языке, Google здесь ваш друг. В качестве книги я бы порекомендовал Язык программирования C

  • . Если у вас есть новая информация, неплохо было бы отредактировать ее в исходном сообщении, особенно если это код, это поможет людям понять, что ты имеешь в виду.

  • Вы пытаетесь преобразовать строку, в основном массив символов, в один символ, что, конечно же, потерпит неудачу. Вы хотите сделать что-то вроде следующего.

     символьное имя пользователя [256];
    символьный пароль [256];
    scanf ("% s% s", имя пользователя, пароль);
    

    Не стесняйтесь комментировать / редактировать, я очень устарел даже в базовом C.

РЕДАКТИРОВАТЬ 2 Как предупреждал Джеймсдлин, использование scanf так же опасно, как и ].

8
ответ дан 3 December 2019 в 15:34
поделиться

gets() является небезопасным. Она принимает один параметр - указатель на буфер char. Спросите себя, насколько большим вы должны сделать этот буфер и как долго пользователь может вводить данные, не нажимая клавишу возврата.

В принципе, нет никакого способа предотвратить переполнение буфера с помощью gets() - используйте fgets().

1
ответ дан 3 December 2019 в 15:34
поделиться

man gets говорит:

Никогда не используйте gets (). Потому что это так невозможно сказать, не зная данные заранее, сколько символов gets () будет читать, и потому что gets () продолжит хранить символы за пределами буфера, использовать его крайне опасно. Это был использован для взлома компьютера безопасность. Вместо этого используйте fgets ().

5
ответ дан 3 December 2019 в 15:34
поделиться

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, возможно, в наши дни есть способ получше.

14
ответ дан 3 December 2019 в 15:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: