разница между printf и получает - PullRequest
3 голосов
/ 16 августа 2010

Я новичок в программировании. Я ссылался на книги по программированию на Си, но я в замешательстве.

1.) В чем разница между printf и get? Я считаю, что получить проще и не имеет форматов?

Ответы [ 3 ]

7 голосов
/ 16 августа 2010

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 */);
2 голосов
/ 16 августа 2010

printf: позволяет форматировать строку из компонентов (т. Е. Брать результаты из переменных), а при выводе в стандартный вывод не добавляет символ новой строки.Вы должны сделать это, вставив '\ n' в строку формата.

puts: выводить только строку в стандартный вывод, но потом добавлять новую строку.

scanf:сканировать поля ввода, по одному символу за раз, и конвертировать их в соответствии с заданным форматом.

gets: просто прочитать строку из stdin, без учета формата, возвращаемый символ заменяется символом конца строки'\ 0'.

http://en.wikipedia.org/wiki/Printf

http://en.wikipedia.org/wiki/Gets

2 голосов
/ 16 августа 2010

Они принципиально выполняют разные задачи.

printf: выводит текст на консоль.
gets: считывает ввод с клавиатуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...