проблема printf в linux - PullRequest
       3

проблема printf в linux

4 голосов
/ 07 сентября 2011

Ниже приведена простая программа для печати в формате «1.2» в HP и Linux.Тем не менее, поведение отличается.Я не хочу увеличивать вопрос, но программа, в которой это происходит, имеет значение с плавающей запятой в строке, поэтому использование% f не вариант (даже использование sprintf).

Кто-нибудь сталкивался с этим раньше?Какое поведение правильно?

Это не должно быть проблемой компилятора, но все же пробовали это на gcc, icpc, icc, g ++.

#include <stdio.h>

int main()
{
   printf("%s = [%010s]\n", "[%010s]",  "1.2");
   return 0;
}

**HP:**
cc test2.c -o t ; ./t
[%010s] = [00000001.2]

**Linux:**
icc test2.c -o t ; ./t
[%010s] = [       1.2]

Редактировать: Большое спасибо всем за ответы*

Ответы [ 4 ]

7 голосов
/ 07 сентября 2011

На справочной странице glibc printf(3):

   0      The value should be zero padded.  For d, i, o, u, x, X, a, A, e,
          E,  f, F, g, and G conversions, the converted value is padded on
          the left with zeros rather than blanks.  If the 0  and  -  flags
          both  appear,  the  0  flag is ignored.  If a precision is given
          with a numeric conversion (d, i, o, u, x, and X), the 0 flag  is
          ignored.  For other conversions, the behavior is undefined.

Таким образом, нельзя ожидать, что флаг 0 с s заполнит строку с 0 s в системах на основе glibc.

2 голосов
/ 07 сентября 2011

Согласно странице man, поведение флага 0 для всего, кроме d, i, o, u, x, X, a, A, e, E, f, F, g иG преобразования не определены.Итак, оба в порядке.

РЕДАКТИРОВАТЬ: Когда я говорю "хорошо", я имею в виду с точки зрения компилятора / libc.С точки зрения вашего приложения, поведение, на которое вы полагаетесь (как в Linux, так и в HP), является ошибкой, и вы должны правильно выполнять форматированную печать.

1 голос
/ 07 сентября 2011

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

printf("%s = [%10s]\n", "[%010s]",  "1.2");

Это * несколько удивительно, что реализация учитывает заполнение строки нулями, ноэто легко исправить.

0 голосов
/ 07 сентября 2011

В дополнение к тому, что Игнасио Васкес-Абрамс сказал, согласно документации для printf, результат того, что вы делаете, - неопределенное поведение.Тот факт, что две ОС дают разные результаты, не является неожиданным.

Фактически, компиляция кода с помощью gcc 4.5.2 в Ubuntu дает следующее предупреждение:

предупреждение: '0'флаг, используемый с форматом '% s' gnu_printf

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