#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 )