Printf
Функция printf записывает строку в формате в стандартный вывод. Отформатированная строка - результат замены заполнителей их значениями. Это звучит немного сложно, но это станет очень ясно на примере:
printf("Hello, my name is %s and I am %d years old.", "Andreas", 22);
Здесь %s
и %d
являются заполнителями , которые заменяются первым и вторым аргументом. На странице руководства (ссылка выше) вы должны прочитать список заполнителей и их параметры, но чаще всего встречаются% d (число) и% s (строка).
Чрезвычайно важно убедиться, что аргументы-заполнители соответствуют их типу. Например, следующий код приведет к неопределенному поведению (это означает, что может произойти все что угодно: может произойти сбой программы, она может работать, она может повредить данные и т. Д.):
printf("Hello, I'm %s years old.", 22);
К сожалению, в C нет способа избежать этих относительно распространенных ошибок.
получает
Функция gets используется для совершенно другой цели: она читает строку из стандартного ввода.
Например:
char name[512];
printf("What's your name? ");
gets(name);
Эта простая программа запросит у пользователя имя и сохранит то, что он или она вводит в name
.
Однако, get () должен использоваться НИКОГДА . Он откроет ваше приложение и систему, в которой он работает, с уязвимостями безопасности.
Цитата из справочной страницы:
Никогда не использовать get () . Потому что это так
невозможно сказать, не зная
данные заранее, сколько символов
получает () будет читать, а потому получает ()
будет продолжать хранить символы прошлого
конец буфера, это чрезвычайно
опасно использовать. Он был использован для
нарушить безопасность компьютера. Используйте fgets ()
вместо этого.
Объяснено более простым способом, проблема в том, что если заданная вами переменная получает (name
в этом случае) недостаточно велика для хранения того, что пользователь вводит, произойдет переполнение буфера, то есть gets
будет написать после конца переменной. Это неопределенное поведение, и в некоторых системах оно позволяет исполнителю выполнять произвольный код.
Поскольку переменная должна иметь конечный статический размер, и вы не можете установить ограничение на количество символов, которые пользователь может вводить в качестве ввода, gets()
никогда не бывает безопасным и никогда не должен использоваться. Он существует только по историческим причинам.
Как и предлагалось в руководстве, вы должны использовать fgets . Он имеет ту же цель, что и gets
, но имеет аргумент size
, который определяет размер переменной:
char *fgets(char *s, int size, FILE *stream);
Итак, вышеприведенная программа станет:
char name[512];
printf("What's your name? ");
fgets(name, sizeof(name) /* 512 */, stdin /* The standard input */);