Как правильно использовать printf для печати размера t?


Size_t определяется как unsigned целое число, но его размер зависит от того, находитесь ли вы на 32-или 64-разрядной машине. Каков правильный и портативный способ распечатать size_t?

3 63

3 ответа:

попробуйте использовать %zu формат строки

size_t val = get_the_value();
printf("%zu",val);

часть z-это спецификатор длины, который говорит, что аргумент будет size_t в длину.

источник http://en.wikipedia.org/wiki/Printf#printf_format_placeholders

на этом есть тег C++, так что cout << еще один возможный ответ.

Это удивительно трудно получить право во всех версиях C. В C90, бросая в unsigned long должно работать, но это вполне может не работать в C99, и решения C99 не обязательно будут работать в C90. Возможность надежно различать C90 и C99 была введена в изменениях 1995 года (указание допустимых значений для __STDC__). Я не думаю, что есть полностью портативный способ, который работает для С90, C99 и C++, хотя есть решения для любого отдельного из них.

Я думаю, что ответ на C++:

std::size_t n = 1;
std::cout << n;

для C-style IO это немного сложнее. В C99 они добавили z модификатор длины для size_t значения. Однако до TR1 это не поддерживается, поэтому вы остаетесь с приведением к определенному размеру, например:

std::size_t n = 1;
std::printf("%lu\n", static_cast<unsigned long>(n));

потом опять unsigned long long на самом деле не поддерживается C++ в любом случае, так что выше будет работать нормально, так как unsigned long является крупнейшим юридическим интегральным типом. После TR1 вы можете использовать %zu безопасно для size_t значения.