Преобразование: uid_t в строку, off_t в строку - PullRequest
1 голос
/ 28 апреля 2009

В настоящее время я пишу домашнее задание по системному программированию, и в одной части мне нужно получить некоторую информацию о файле в каталоге.

для статистики файла, у нас есть функция ctime(), которая преобразует тип time_t в string и возвращает указатель на него.

а как насчет типов uid_t и off_t? Я искал в интернете и не смог найти какую-либо функцию. Или, если функции не существует, подскажите, пожалуйста, как реализовать такую ​​функцию?

Ответы [ 5 ]

4 голосов
/ 28 апреля 2009

Оба определены как арифметические типы (http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/types.h.html), и на практике являются положительными и целочисленными. Таким образом, вы можете просто привести к беззнаковому длинному длинному и использовать sprintf с "% llu" для преобразования в строку.

2 голосов
/ 28 апреля 2009

size_t и off_t являются просто беззнаковыми целочисленными типами. (Изменить: off_t это длинный? Видите, урок, проверьте ваши заголовки!)

Поэтому используйте sprintf (или что-то еще), чтобы преобразовать их, используя спецификатор формата "% i".

При редактировании: дерьмо, вы изменили size_t на uid_t, пока я отвечал. uid_t определено в types.h; посмотрите там. (Это также беззнаковый целочисленный тип, но unsigned short.)

1 голос
/ 28 апреля 2009

Linux ' snprintf () поддерживает спецификатор формата' z 'для значений типа size_t. Не уверен, насколько это портативно, вам нужно внимательно изучить раздел «СООТВЕТСТВУЕТ».

Для off_t вам может потребоваться привести к наибольшему целому типу без знака, т.е. unsigned long и использовать спецификатор "lu".

0 голосов
/ 22 июня 2017

Используя gcc 5.4.0 следующую строку:

printf("user #%ld did this or that!\n", uid);

поднял следующее предупреждение:

..main.c:133:9: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 2 has type ‘uid_t {aka unsigned int}’ [-Wformat=]

Я бы посоветовал вам сделать то же самое и проверить вывод вашего компилятора. =)

0 голосов
/ 28 апреля 2009

off_t - это long int: формат = "% ld"

size_t - это unsigned int: format = "% u"

Вы можете использовать эти форматы в функции sprintf для преобразования в символ *.

...