Это не очень интересно. Намного интереснее то, что функция printf()
printf() в языке C выглядит следующим образом:int printf(const char* format, ...);
Многоточие (...
printf() так:void f1(double d, char* s, int i, char ch)
{
printf("double %g string %s int %d char %c\n", d, s, i, ch);
}
где символы %g
%s означают: “Напечатать С-строку”, символы %d означают: “Напечатать целое число, используя десятичные цифры,” а символы %c означают: “Напечатать символ”. Каждый такой спецификатор формата связан со следующим, до поры до времени не используемым аргументом, так что спецификатор %g выводит на экран значение переменной d; %s — значение переменной s, %d — значение переменной i, а %c — значение переменной ch. Полный список форматов функции printf() приведен в разделе Б.10.2. printf()
char a[] = { 'a', 'b' }; /* нет завершающего нуля */
void f2(char* s, int i)
{
printf("goof %s\n", i); /* неперехваченная ошибка */
printf("goof %d: %s\n", i); /* неперехваченная ошибка */
printf("goof %s\n", a); /* неперехваченная ошибка */}
Интересен эффект последнего вызова функции printf(): она выводит на экран каждый байт участка памяти, следующего за элементом a[1], пока не встретится нуль. Такой вывод может состоять из довольно большого количества символов.
Недостаток проверки типов является одной из причин, по которым мы предпочитаем потоки iostream
stdio языков C и C++, работает одинаково. Другой причиной является то, что функции из библиотеки stdio не допускают расширения: мы не можем расширить функцию printf() так, чтобы она выводила на экран значения переменных вашего собственного типа. Для этого можно использовать потоки iostream. Например, нет никакого способа, который позволил бы вам определить свой собственный спецификатор формата %Y для вывода структуры struct Y.Существует полезная версия функции printf()
int fprintf(FILE* stream, const char* format, ...);
Рассмотрим пример.
fprintf(stdout,"Hello, World!\n"); // идентично
// printf("Hello,World!\n");
FILE* ff = fopen("My_file","w"); // открывает файл My_file
// для записи
fprintf(ff,"Hello, World!\n"); // запись "Hello,World!\n"
// в файл My_file
Дескрипторы файлов описаны в разделе 27.6.3.
27.6.2. Ввод
Ниже перечислены наиболее популярные функции из библиотеки stdio
int scanf(const char* format, ...); /* форматный ввод из потока stdin */
int getchar(void); /* ввод символа из потока stdin */
int getc(FILE* stream); /* ввод символа из потока stream*/
char* gets(char* s); /* ввод символов из потока stdin */
Простейший способ считывания строки символов — использовать функцию gets()
char a[12];
gets(a); /* ввод данных в массив символов a вплоть до символа '\n' */