2013-08-30 70 views
9

Các printfscanf gia đình của các chức năng trong C tiêu thụ một số ít các định dạng specifiers nguyên thủy tương ứng với các kiểu dữ liệu cơ bản – %d cho int, %llu cho unsigned long long int vvPosix có cung cấp các chuỗi định dạng chuỗi cho printf/scanf không?

Tuy nhiên, có một số lượng lớn các loại tiêu chuẩn các bí danh mà người ta muốn sử dụng trong thực tế, chẳng hạn như int32fast_t và một người không thể và không cần phải biết loại cơ bản cơ bản. Đối với các bí danh trong stdint.h, tiêu chuẩn C may mắn xác định một tập hợp các macro để tạo ra các định dạng chuỗi tương ứng, như PRI32, trong inttypes.h.

Có một bộ tương tự như các macro cho Posix? Posix có tấn của các loại đục như ssize_t, pid_t, rlim_t, suseconds_t, vv, đó là tất cả các biến thể trên các loại intgral cơ bản. Làm thế nào một người có thể sử dụng một cách hiệu quả các loại đó trong các chuỗi định dạng?

+2

nếu mọi thứ khác không thành công, bạn luôn có thể chuyển đổi thành '(u) intmax_t' và in – Christoph

+0

Cách giải quyết thú vị - Tôi không bao giờ nghĩ về điều đó: -S –

+0

(Mặc dù đi ngược lại, tức là' scanf', tôi phải làm một kiểm tra tràn bằng tay và tìm ra những gì để so sánh một cách chính xác.) –

Trả lời

0

Posix đảm bảo rằng giá trị sys/types.h là một "loại cộng của chiều dài thích hợp" với một vài người khác như đang được tiếp tục quy định như unsigned hoặc ký 'chiều dài mở rộng'. Cách tiêu chuẩn duy nhất chấp nhận được để xuất ra những thông tin đó là chuyển nó qua một loại ngôn ngữ thích hợp lớn nhất (u) intmax_t và sau đó xuất ra.

Việc nhập chúng sẽ nguy hiểm hơn (tức là, không thể trong thời trang tuân thủ tiêu chuẩn) vì sẽ rất khó để đảm bảo chuyển đổi của bạn thành loại cơ sở không tràn thứ gì đó.

1

Gói sfio (một phần của AT & phần mềm mã nguồn mở AST T Labs') có chức năng tương tự như printf và scanf mà cho phép bạn xác định kích thước của giá trị số (thường sử dụng sizeof()) như là một tham số bổ sung. Một số ví dụ:

sfprintf(sfstdout, "%I*d", sizeof(intval), intval); 
sfscanf(sfstdin, "%I*f", sizeof(fltval), &fltval); 

USENIX paper: Extended Data Formatting Using Sfio.