П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 3525 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 6122 раз(а).

Учебник HTML.
Просмотров 3276 раз(а).

Руководство по PHP5.
Просмотров 5499 раз(а).

Хостинг через призму DNS.
Просмотров 4151 раз(а).

Подборка текстов стандартных документов.
Просмотров 55775 раз(а).

Учебник PHP - Самоучитель
Просмотров 3093 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 5768 раз(а).

Внешние атаки...
Просмотров 3843 раз(а).

Учебник PHP.
Просмотров 2826 раз(а).

SSI в примерах.
Просмотров 37463 раз(а).






 
 
| Добавить в избранное | Сделать стартовой Project.Net.Ru | Помощь





printf() : они меня обманывали!

Замечание для тех, кто не живет во Франции: в нашей прекрасной стране есть велогонщик, который несколько месяцев делал вид, что не принимал допинг, в то время как другие члены его команды признали это. Он утверждает, что если он и принимал допинг, то не знал об этом. Поэтому известное кукольное шоу использовало французское предложение "on m'aurait menti !", которое и подало мне идею, что написать в этом заголовке.

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

/* display.c */
#include <stdio.h>

main() {
  int i = 64;
  char a = 'a';
  printf("int  : %d %d\n", i, a);
  printf("char : %c %c\n", i, a);
}
Выполняя ее мы получаем :
>>gcc display.c -o display
>>./display
int  : 64 97
char : @ a
Первый printf() выводит значение целой переменной i и символьной переменной a, как значение типа int(это делается при помощи %d) - это приводит к выводу ASCII-значения этого символа. С другой стороны, второй printf() переводит целое значение i в соответствующий код символа ASCII, а именно - 64.

Ничего нового - все одинаково для многих функций, прототипы которых похожи на функцию printf():

  1. один аргумент - строка символов (const char *format), которая используется для указания выбранного формата;
  2. один или более необязательных аргументов, содержащих переменные, в которых значения форматированы в соответствии с указаниями предыдущей строки.

Большинство уроков по программированию останавливаются на этом, предоставляя неполный список возможных форматов (%g, %h, %x, использование символа точки . для указания точности...). Однако, есть еще один, о котором никогда не упоминают: %n. Вот что говорит страница man по printf() об этом:

Число символов, выведенных до этого момента, сохраняется по адресу целого числа, указанному аргументом-указателем типа int * (или variant). Преобразование аргументов не происходит.

Здесь - самая важная вещь в этой статье: данный аргумент позволяет производить запись в переменную указатель, даже если она используется в функции для вывода!

Перед тем как продолжить, заметим, что данный формат также присутствует в функциях семейств scanf() и syslog().

Назад | Содержание | Вперед



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru