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

О проекте

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

MySQL

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

Хостинг

Другое








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

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

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

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

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

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

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

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

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

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

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

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






 
 
| Добавить в избранное | Сделать стартовой 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