fprintf выдает другой результат

#c #c builder #borland-c

#c #c builder #borland-c

Вопрос:

Я скомпилировал следующую программу в C Builder 3 и C Builder 5, она выдает другой результат:

 #include <vcl.h>
#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
  const char filename[] = "C://fprintf-test.txt";
  FILE *file = fopen(filename, "a");

  fprintf(file, "%0*.0fn", 7,  99999.00);
  fprintf(file, "%0*.0fn", 7, -99999.00);
  fprintf(file, "%0*.0fn", 7, -999.00);
  fprintf(file, "%0*.0fn", 7, 999999.00);
  fprintf(file, "%0*.0fn", 7, 9.00);

  return 0;
}
  

Вывод в C Builder 3:

 0099999
-0099999
-0000999
0999999
0000009
  

Вывод в C Builder 5:

 0099999
-099999
-000999
0999999
0000009
  

Вы можете ясно видеть, что заполнение 0 отрицательных значений отличается. Почему это? Задокументировано ли это?

Заранее спасибо

Комментарии:

1. Зачем этот супер-надуманный пример, чтобы показать это? Пожалуйста, подумайте об упрощении при запросе, чтобы уменьшить шум.

2. Потому что теперь люди могут протестировать это сами, из коробки. Но я буду иметь это в виду в своем следующем вопросе, спасибо 🙂

3. Конечно, любой вопрос должен гарантировать это. Я думаю, мне интересно: вы имеете в виду, что вы не получите эту разницу, если запустите программу, main() состоящую { printf(".0fn", -999); return 0; } из * , то есть без файла, других операторов печати и использования,, для ширины поля?

4. Не имеет значения, используется printf или fprintf и с * или без него.

5. Красиво оформленный вопрос. Это, безусловно, ошибка C Builder 3.

Ответ №1:

Я пробую это на gcc :

 // gcc -o test.exe test.c
#include <stdio.h>
int main(int argc, char* argv[])
{
  printf("%0*.0fn", 7,  99999.00);
  printf("%0*.0fn", 7, -99999.00);
  printf("%0*.0fn", 7, -999.00);
  printf("%0*.0fn", 7, 999999.00);
  printf("%0*.0fn", 7, 9.00);
  return 0;
}
  

Это результат :

 0099999
-099999
-000999
0999999
0000009
  

в документации printf говорится :

ширина : минимальное количество символов для печати Если выводимое значение короче этого числа, результат дополняется […] Значение не усекается, даже если результат больше.

Они говорят о символах (минус — это символ).

Я не знаю C builder. Посмотрите на разницу в документации printf C builder версии V3 / 5. (возможно, это ошибка в версии V3 …)

Комментарии:

1. Да, именно таким должен быть результат. Но в BCB3 он выдает другой вывод, который не соответствует ANSI C imo. Мне интересно, почему это не так, и где это задокументировано.

2. Скорее всего, в не задокументированном BCB3 есть ошибка, а BCB5 ее исправляет. Не все исправления ошибок были задокументированы. И попытаться найти документацию для такого старого компилятора будет очень сложно.

3. Похоже, что отчетов BCB3 о контроле качества нет.. Я даже не думаю, что QC существовал тогда

Ответ №2:

Как @chux заявил в комментариях: это, вероятно, ошибка C Builder 3. Это не задокументировано.

Если у кого-то есть эта проблема, мы исправили ее следующим образом:

 fprintf(FileOut, "%0*.*fn",
#if ( __BORLANDC__ >= 0x560 )
        paddingNumber,
#else
        paddingNumber < 0 ? paddingNumber - 1 : paddingNumber,
        paddingNumber )