2013-12-07 3 views
2

Я заметил сегодня, что иногда, когда я использую функцию gets, мой компилятор просто игнорирует ее. ОК. Это пример, где получает произведения:получает функцию не читает мою переменную

#include <stdio.h> 
void main() 
{ 
    char s[50]; 
    gets(s); 
    puts(s); 
} 

Теперь, если я делаю это простое изменение в моей программе, функция получает игнорируется:

#include <stdio.h> 
void main() 
{ 
    int n;  
    printf("dati n:\n");  
    scanf("%d",&n);  
    char s[50]; 
    gets(s); 
    puts(s); 
} 

«игнорируется» означает, что, когда я запустить программу на компилятор читает переменную, а затем завершает работу без чтения моей строки. Почему это происходит? Спасибо.

+3

Компилятор всегда должен игнорировать 'get', в принципе. Не используйте его, это небезопасно. – Kninnug

+3

Ваш компилятор прав. Игнорировать 'gets()'. Просто используйте 'fgets()'. : P –

+1

Это потому, что 'scanf()' "хватило" цифр, которые вы хотели прочитать, а это значит, что когда он 'gets()' 'поворачивается, чтобы читать, ничего не осталось. Сторона примечания: 'gets()' is _extremely_ плохой стиль. Предпочитайте 'fgets()' в будущем. 'gets()' настолько опасен, что был удален в последнем стандарте C. –

ответ

5

Ваш scanf использует только тот номер, который вы набрали. Все остальное после этого , включая, возвращает символ возврата/новой строки, который находится в буферах ввода-вывода.

Таким образом, gets берет все, что осталось после номера (возможно, только символ новой строки) и немедленно возвращается.

В комментариях не указаны: gets. Фактически он был удален из стандарта C (уже не в C11), поскольку он принципиально небезопасен. Вместо этого используйте fgets.

+0

Я начинаю, я читаю на форумах сегодня, что становится опасным, но я все еще использовал его, потому что я не знаю прототипа fgets. – user3078259

+1

Просто введите «fgets» в свою любимую поисковую систему, вы получите много информации, включая официальные стандарты (http://pubs.opengroup.org/onlinepubs/009695399/functions/fgets.html) и множество примеров. – Mat