получает (переменная) - PullRequest
       6

получает (переменная)

1 голос
/ 22 апреля 2010

Может кто-нибудь сказать мне, почему get (abc) работает с char [], но не с int?

 int abc;
 char name[] = "lolrofl";
 printf("Hello %s.\n",name);
 printf("\n >> ");
 fflush(stdin);
 gets (abc);
 printf("\n die zahl ist %i.\n",abc);
 system("Pause");
 return(0);

Ответы [ 4 ]

11 голосов
/ 22 апреля 2010

Прототип для gets () :

char* gets(char *s);

Обратите внимание, что функция НЕ читает только один символ и помещает его в s;он фактически читает всю строку в s.Однако, поскольку gets () не предоставляет способ указания максимального количества символов для чтения, это может фактически считывать больше символов в s, чем есть байты, выделенные для s.Таким образом, эта функция является серьезной уязвимостью переполнения буфера , и вам никогда не следует использовать эту функцию.Существуют альтернативные, более безопасные функции, которые позволяют вам читать вводимые пользователем данные, такие как fgets () и getc () .

Если вы используете C ++, тогдаиспользование потоковой библиотеки ввода-вывода C ++ (std :: cin, std :: cout, std :: ostream, std :: istream, std :: fstream и т. д.) является гораздо лучшим способом выполненияВвод / вывод, чем использование этих других функций.

Функция gets () настолько опасна, что в моей разработке и кодировании пользовательской поисковой системы я вынул повышение по получает и ряд других подобных функций, предупреждающих о неиспользовании!

4 голосов
/ 22 апреля 2010

Потому что он читает только символы. Используйте scanf () для форматированного чтения.

Кстати, поскольку вы, похоже, используете C ++ (или, по крайней мере, ваш выбор тегов так говорит), возможно, вам следует попробовать std :: cin / std :: cout.

1 голос
/ 22 апреля 2010

Если вы посмотрите на C Reference, на ваш вопрос будет дан ответ. Я вставлю это для вас:

char * gets (char * str);

Функция gets () читает символы из stdin и загружает их в str, пока не будет достигнут перевод строки или EOF. символ перевода строки переводится на нулевое окончание. Возвращаемое значение gets () - строка для чтения или NULL если есть ошибка. Обратите внимание, что получает () не выполняет проверку границ, и Таким образом рискует обгон ул. Для похожая (и более безопасная) функция, которая включает проверку границ, см. fgets ().

Так что вы не сможете привести целую строку к целому числу.

0 голосов
/ 23 апреля 2010

Во-первых, функция gets предназначена для чтения строк или текста , а не чисел.

Во-вторых, не используйте gets, так как в нем есть ошибки переполнения буфера. См. C FAQ по языку для получения дополнительной информации. Функция fgets является более безопасной альтернативой.

В-третьих, вы можете переключиться на потоки C ++ и std::string. Потоки C ++ более дружественны к типу, чем потоки C.

В-четвертых, fflush не работает на входных потоках. Функция fflush предназначена для записи оставшихся данных в потоковых буферах в выходной поток. В C ++ существует метод ignore, который игнорирует входящие символы до тех пор, пока не будет прочитана новая строка (по умолчанию) или указанный символ (или не достигнут предел).

Надеюсь, это поможет.

...