2014-01-13 1 views
0

Я пытаюсь получить строковый ввод от пользователя, используя fgets , но fgets не дождался ввода и после наложения денег. Я узнал о функции gets, которая, кажется, работает нормально. Мои вопросы: 1. Почему gets работает, когда я вводил более 10 символов, если я объявил массив из десяти элементов. Вот мой кодИспользование «получает» для ввода строки в C

#include<stdio.h> 

int main(void){ 

    char name[10]; 

    printf("Please enter your name: "); 
    gets(name); 
    printf("\n"); 
    printf("%s", name); 

    return 0; 

} 

мой вход при тестировании: morethantenletters
выход будет:
Конечно, это должно было бы вызвать некоторые ошибки «morethantenletters», нет? Поскольку name составляет всего десять элементов.
2. Мой следующий вопрос: мой код также работает, когда я использую gets(&name) вместо gets(name). - Я не понимаю, почему. &name отправляет адрес name.
пока name просто отправляет его значение, нет?

+3

Никогда не используйте gets(). Он не защищает от переполнения памяти. – seand

+0

'fgets' ждет ввода. – woolstar

+0

Блокировка не является проблемой; как fgets(), так и gets() соответственно для ввода. Проблема в gets() не имеет способа узнать, сколько места доступно в целевом char *. – seand

ответ

2

Именно поэтому вы всегда должны использовать fgets для замены gets. Массив name имеет только 10 элементов, но вы пытаетесь сохранить в нем больше, чем это возможно. fgets предотвращает переполнение буфера, но gets этого не делает.

Это неопределенное поведение, когда вы используете gets таким образом, не используйте его.

1
Since name is only ten elements long. 

Все приняли более 10 будет переполнение буфера и может вызвать проблемы запуска времени. Поэтому убедитесь, что ваш размер правильный. Подсказка: используйте вместо этого getline или fgets.

while name is just sending the value of it, no? 

Для символьных массивов, name также обратиться к своему исходному положению.

+0

Используйте fgets() вместо этого, поскольку указан максимальный размер. Не используйте gets() !. На страницах человека это ясно сказано. – seand

+0

@seand Спасибо .. ответ отредактирован. –