Почему printf выводит не то что нужно

Почему неправильный вывод значений в printf?

В книге С.Прата. Язык программирования С представлен пример кода, который показывает что в определенных случаях даже с использованием правильного спецификатора возможен не тот результат который ожидался изначально*.
Вроде как общая логика понятна, но непонятны некоторые моменты в объяснении. Там приводится следующий пример:

И показываются результаты выполнения. Не совсем понятно откуда такой результат после объяснения. Там говорится что значения аргументов записываются в стек руководствуясь типами а не спецификаторами. Следовательно в стек сначала запишется «а» (64 бита), далее «b» (64 бита), потом «с» (32 бит) и в конце «d» (32 бита). Но при выводе, функция будет руководствоваться спецификаторами (везде %ld (32 бита)). Начнет считывать стек. Вот тут непонятно. Стек считывается как бы с конца, а спецификаторы записаны в порядке записи в стек аргументов. Вот встретился первый спецификатор, его нужно заменить на первый аргумент, но первым считываться из стека будет как раз таки последний аргумент. Вот этот момент не понятен, что происходит в момент считывания стека и замены спецификаторов.
Почему printf выводит не то что нужно
Там представлена такая картинка. Она еще больше непонятностей создает. Вроде как запись в стек отображена правильно, а вот считывание непонятно, не с того конца началось. Получается что это и не стек вовсе а очередь.

В итоге у меня получилось что вещественные числа со спецификатором %ld вывелись как нули, а переменные с типом long, вывелись как надо. (В книге же результат получился таким: 0 неожиданное число 0 неожиданное число).
Что то все не сходится у меня в голове. Объяснение в книге, результат в книге и мои результаты, все отличается и не сходится.

Объясните пожалуйста работу данного примера, желательно бы с графическим представлением памяти.

PS. Используя разные компиляторы, получаются разные результаты вывода. Получается даже разная последовательность значений. В одном случае числа с типом long выводятся первыми, а далее неправильные значения чисел double. В другом же случае наоборот.
PSS. Вычитал что стандарт такое поведение не определяет. Но все равно хочется понять как все таки компиляторы обрабатывают данную ситуацию.

Источник

Ввод-вывод в Си

Основной задачей программирования является обработка информации, поэтому любой язык программирования имеет средства для ввода и вывода информации. В языке Си нет операторов ввода-вывода.

Вывод информации

Функция printf() предназначена для форматированного вывода. Она переводит данные в символьное представление и выводит полученные изображения символов на экран. При этом у программиста имеется возможность форматировать данные, то есть влиять на их представление
на экране.

Общая форма записи функции printf() :

СтрокаФорматов состоит из следующих элементов:

Объекты могут отсутствовать.

Управляющие символы не выводятся на экран, а управляют расположением выводимых символов. Отличительной чертой управляющего символа является наличие обратного слэша ‘\’ перед ним.

Основные управляющие символы:

Форматы нужны для того, чтобы указывать вид, в котором информация будет выведена на экран. Отличительной чертой формата является наличие символа процент ‘%’ перед ним:

Результат работы программы
Почему printf выводит не то что нужно

Тот же самый код может быть представлен с использованием одного вызова printf :

Табличный вывод

При указании формата можно явным образом указать общее количество знакомест и количество знакомест, занимаемых дробной частью:

В приведенном примере 10 — общее количество знакомест, отводимое под значение переменной; 5 — количество позиций после разделителя целой и дробной части (после десятичной точки). В указанном примере количество знакомест в выводимом числе меньше 10, поэтому свободные знакоместа слева от числа заполняются пробелами. Такой способ форматирования часто используется для построения таблиц.

Почему printf выводит не то что нужно

Ввод информации

Функция форматированного ввода данных с клавиатуры scanf() выполняет чтение данных, вводимых с клавиатуры, преобразует их во внутренний формат и передает вызывающей функции. При этом программист задает правила интерпретации входных данных с помощью спецификаций форматной строки.
Общая форма записи функции scanf( ) :

Строка форматов и список аргументов для функции обязательны.

Результат работы программы:
Почему printf выводит не то что нужно

Функция scanf( ) является функцией незащищенного ввода, т.к. появилась она в ранних версиях языка Си. Поэтому чтобы разрешить работу данной функции в современных компиляторах необходимо в начало программы добавить строчку

Комментариев к записи: 96

#include
#include
#include
#include

int main() <
int a[4][5];
int i,j,range,max,maxi,maxj;
float kproiz1,kproiz2;
int proiz1=1;
int proiz2=1;

Источник

printf не выводит значение строки

заместо значения выводит (null)

Printf не выводит текст
#include #include #include using namespace std; int.

Почему printf выводит не то что нужноПочему не выводит printf?
#include «stdafx.h» #include «iostream» #include «math.h» #include «locale.h» using.

Printf выводит нули
Здравствуйте! Функция printf выводит нули вместо чисел типа double, числа типа int выводятся.

Printf() выводит ерунду
#include «stdafx.h» #include #include #include #include.

честно говоря не знаю в чем проблема но могу чучуть переделать код :

большинство тут для вывода использует printf мне же надо знать как он выводит и почему именно так, а не иначе.

В общем спасибо тем кто помог, это все таки раздел для начинающих

большинство понятие относительно, нужно иметь собственное мнение и голову на плечах

большинство понятие относительно, нужно иметь собственное мнение и голову на плечах

Printf не выводит на экран
Здравствуйте. Использую библиотеку curl, хотелось бы в целях отладки использовать printf, но к.

Функция не выводит значение строки
Доброго Проблема в том, что функция print() не выводит значение. Ломаю голову, что может быть не.

Функция printf не выводит результат на экран
Пишу в Borland C++ ver 3.1 #include #include #include void.

Почему printf выводит не то что нужноКоманда printf выводит произвольное число
Изучаю Си второй день, поэтому ошибка скорее всего идиотская. #include «stdio.h» void main().

Источник

Форматированный вывод. Функция printf

Пожалуйста, приостановите работу AdBlock на этом сайте.

Общий синтаксис функции printf следующий:

Почему printf выводит не то что нужно

Рис.1. Общий синтаксис функции printf.

Напоминаю, что параметрами называется то, что мы записываем рядом с именем функции в круглых скобках.

Кроме обязательной строки форматирования есть и необязательные параметры. Они пишутся через запятую после формат-строки.

Формат-строка.

Еscape-последовательности

Часто используемые escape-последовательности:

Как видите, последние четыре последовательности нужны лишь для того, чтобы вывести на экран символы «»», «’», «\» и «?». Дело в том, что если эти символы просто записать в формат-строку, то они не отобразятся на экране, а в некоторых случаях программа и вовсе не скомпилируется.

Следующая программа иллюстрирует работу escape-последовательностей.

Хотя escape-последовательности состоят из нескольких символов, но в потоке вывода они воспринимаются как цельный символ, который имеет своё собственное значение.

Итого, используя управляющие последовательности мы можем влиять на то, как данные будут выводиться на экране.

Спецификаторы формата.

Для каждого типа данных есть свой спецификатор формата. Ниже записаны основные из них.

Основные спецификаторы формата:

Есть и другие спецификаторы формата. Мы познакомимся с ними тогда, когда они нам понадобятся.

Сами спецификаторы формата на экран не выводятся. Вместо них выводятся данные, которые передаются в функцию printf после строки форматирования.

Функция printf работает следующим образом. Все символы, заключенные в двойные кавычки, кроме управляющих последовательностей и спецификаторов формата, выводятся на экран. Спецификаторы формата во время вывода заменяются на значения, указанные после формат-строки. Причем, если используется несколько спецификаторов формата, то первый спецификатор заменяется на первое значение, расположенное после формат строки, второй – на второе, и т.д.

Посмотрим на примерах.

Почему printf выводит не то что нужно

Рис.2 Вывод Листинг 2.

Почему printf выводит не то что нужно

Рис.3 Вывод Листинг 3.

Почему printf выводит не то что нужно

Рис.4 Вывод Листинг 4.

Почему printf выводит не то что нужно

Рис.5 Вывод Листинг 5.

Почему printf выводит не то что нужно

Рис.6 Принцип работы функции printf.

По сути, формат строка задаёт некоторый трафарет(шаблон), в который подставляются данные для вывода, в том порядке, в котором они указаны.

Напишем небольшую программу, которая иллюстрирует использование спецификаторов формата.

Модификаторы формата.

Модификаторы формата записываются между символом % и буквой используемого типа. На рисунке ниже представлена спецификатор формата с использованием модификатора формата.

Почему printf выводит не то что нужно

Рис.7 Модификатор формата

Первое число обозначает ширину поля, выделяемого для записи числа. Второе число обозначает точность, с которой мы хотим вывести данное вещественное число.

В примере на картинке под вещественное число мы выделяем 8 символов и хотим видеть 3 знака после запятой.

Если указанного в ширине количества позиций нам не хватает для вывода числа, то ширина поля увеличивается автоматически, до минимально-возможного количества позиций.

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

Результат работы данной программы представлен на рисунке ниже.

Почему printf выводит не то что нужно

Рис.8 Вывод Листинг 8.

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

Да, чуть не забыл. Мы решили одну из задач, которая стояла перед нами в начале урока.

Практика

Решите предложенные задачи. Для удобства работы сразу переходите в полноэкранный режим Почему printf выводит не то что нужно

Исследовательские задачи для хакеров:

Дополнительные материалы

Оставить комментарий

Чтобы код красиво отображался на странице заключайте его в теги [code] здесь писать код [/code]

Комментарии

В степике компилятор настроен так, что всем неинициализированным переменным устанавливает значение 0.

На такое поведение надеяться не стоит. В общем случае в переменной будет не нуль, а непонятно что (мусор).

Размещу естественным путем (то есть вручную) на общетематических, форумах уникальные сообщения (посты) с ключевым словом и ссылкой на Ваш сайт. Размером от 200 знаков.
Даю 30 дней гарантии. Если в течение этого времени будет удалена какая либо ссылка, я её заменю.
Ссылки будут размещаться на проверенных форумах в наиболее подходящих разделах общетематических форумов.

Что дает такое размещение?
— Рост позиций вашего сайта в Google по ключевому слову.
— Вычные ссылки
— Дополнительные тематические источники трафика
— Разбавление ссылочной массы
— Тематический трафик на Ваш сайт

Заказав тариф «БИЗНЕС», Вы уже через месяц увидете результат.
Это может быть как повышения трафика, повышение позиций Вашего сайта в Google, увелечение продаж и так далее.

Заказать и ознакомиться с тарифами Вы сможете перейдя по ссылке: (Ссылка ведет на биржу kwork)

Для примера:
— Ссылки с 60 форумов Украина. Создание топиков. http://gg.gg/ukr_links2
— Ссылки с 60 форумов Франции. Создание топиков. http://gg.gg/french-links
— Ссылки с 60 форумов Германии. Создание топиков. http://gg.gg/germany-links

Обращайтесь по контактам: Telegram @eTraffik

I will post in a natural way (that is, manually) on general forums, unique messages (posts) with a keyword and a link to your site. Size from 200 characters.
I give a 30-day guarantee. If any link is removed during this time, I will replace it.
Links will be posted on verified forums in the most appropriate sections of general forums.

What does this placement give?
— Growth of positions

Источник

Вывод строки в printf

Есть варианты кода, пытающиеся вывести строку «abc» в stdout.

Почему только посл. вариант ничего не выводит на экран? Неужели всё дело лишь в терминальном нуле? Почему компилятор не может добавить его самостоятельно, как, например, во втором примере здесь? Дело в том, что, не указав размер массива явно, я сказал компилятору, что размер будет равен кол-ву элементов в списке инициализации?

Ну, даже в таком случае я думал, что printf выведет хоть что-то на экран, пусть это было бы и не то, что ожидалось.

Неужели printf сначала проверяет наличие терминального нуля в строке, которую он собирается вывести в stdout? Исходников crt под рукой нет, посмотреть не могу.

И как прав. называется конструкция вида

Вывод строки фиксированной длинны в cout (аля printf(%5.0d)!
Добрый вечер! Сегодня встал перед выбором. как выводить через printf или cout. Через принтф код.

Printf вывод операций
Здравствуйте Помогите понять Нужно расширить программу что бы можно было умножать делить и.

Почему printf выводит не то что нужноСтранный вывод printf
Есть код: struct Player < string Name; double HP; >; int main() <

YourLastSong, да, дело в нуле, как раз конец строки для printf. И массив, это не строка, к нему не может ничего добавляться. В том числе и \0 как после «abc».

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *