Làm thế nào để inff không dấu dài dòng trong C?


342

Tôi không bao giờ có thể hiểu làm thế nào để in unsigned longkiểu dữ liệu trong C.

Giả sử unsigned_foolà một unsigned long, sau đó tôi thử:

  • printf("%lu\n", unsigned_foo)
  • printf("%du\n", unsigned_foo)
  • printf("%ud\n", unsigned_foo)
  • printf("%ll\n", unsigned_foo)
  • printf("%ld\n", unsigned_foo)
  • printf("%dl\n", unsigned_foo)

Và tất cả trong số họ in một số loại -123123123thay vì unsigned longtôi có.

Câu trả lời:


499

%lulà định dạng chính xác cho unsigned long. Âm thanh như có những vấn đề khác đang diễn ra ở đây, chẳng hạn như hỏng bộ nhớ hoặc một biến chưa được khởi tạo. Có lẽ cho chúng ta thấy một bức tranh lớn hơn?


12
Rất tiếc, %lulàm việc lần này. Cảm ơn. Một cái gì đó khác đã xảy ra trước đây và nó đã không hoạt động.
Bodacydo

1
@bodacydo: Nếu bạn gặp lỗi, nó có thể xuất hiện ở mức bán ngẫu nhiên ... đảm bảo biến của bạn có giá trị hợp lệ trước khi bạn thử in nó.
Thanatos

1
Ngay cả khi biến không được khởi tạo, sẽ không có cách nào printf đạt đến điểm mà nó có thể in dấu trừ khi chỉ định định dạng %lu. Về mặt kỹ thuật, đó là hành vi không xác định nhưng trong thực tế, biến có một giá trị không thể đoán trước được chuyển đến printf mà printf sau đó diễn giải là không dấu. Tôi đoán vấn đề ban đầu của Bodacydo là dòng chảy đến một cuộc gọi printf không chính xác thay vì cuộc gọi dự định ...
R .. GitHub DỪNG GIÚP ICE

8
@Aquera Kaul:% lu là thông số kỹ thuật chuyển đổi hợp lệ,% ul thì không. %lu, chia ra là: %- bắt đầu một "đặc tả chuyển đổi"; l- công cụ sửa đổi độ dài, lcó nghĩa là "[không dấu] dài int"; u- công cụ xác định chuyển đổi, udành cho một số unsigned intđược in ra dưới dạng thập phân. Bởi vì chúng tôi đã đưa ra công cụ sửa đổi độ dài l, sau đó nó chấp nhận một unsigned long int. Các chữ cái phải theo thứ tự đó: phần trăm, độ dài, chuyển đổi. (Có một vài tùy chọn khác, chẳng hạn như chiều rộng và độ chính xác, mà bạn có thể thêm. Xem trang người đàn ông , vì nó ghi lại tất cả điều này một cách chính xác!)
Thanatos

1
% ul sẽ chỉ in không dấu (với% u), và sau đó chữ "l" nguyên văn. Giống như "% uw" sẽ in không dấu, theo sau là chữ "w". % bắt đầu kết luận, u (hoặc một số ký tự khác, như d, s, c ...) kết thúc nó.
Veky


28

Đối với int %d

Cho int dài %ld

Đối với int lâu dài %lld

Đối với int dài không dấu %llu


23

Trong số tất cả các kết hợp bạn đã thử, %ld%lulà những kết hợp duy nhất là các chỉ định định dạng printf hợp lệ ở tất cả. %lu(thập phân unsigned long), %lxhoặc %lX(hex dài với chữ thường hoặc chữ hoa), và %lo(bát phân dài) là những specifiers định dạng chỉ có giá trị cho một biến kiểu unsigned long (tất nhiên bạn có thể thêm chiều rộng lĩnh vực, độ chính xác, vv bổ giữa %l).


1
% ld sẽ hoạt động tốt cho đến khi giá trị của std :: num_limits <không dấu dài> :: max () / 2. Trên đó% ld sẽ in giá trị sai (giá trị âm).
Kaushik Acharya

1
@KaushikAcharya: Không, trên đó là UB. Và thậm chí còn được cho là UB trước đó, vì printfđược chỉ định để yêu cầu các loại đối số chính xác chính xác mà không có các khoản phụ cấp va_argsẽ có.
R .. GitHub DỪNG GIÚP ICE

9
int main()
{
    unsigned long long d;
    scanf("%llu",&d);
    printf("%llu",d);
    getch();
}

Điều này sẽ hữu ích. . .


9

Các định dạng là %lu.

Vui lòng kiểm tra các kiểu dữ liệu khác nhau và cách sử dụng chúng trong printf tại đây


2
Hành vi phi tiêu chuẩn khác nhau được ghi lại ở đó mà không đánh dấu nó là phi tiêu chuẩn. POSIX là tiêu chuẩn trực tuyến dễ truy cập nhất cho printf; các tiện ích mở rộng ngoài ISO C được đánh dấu bằng thẻ "CX": opengroup.org/onlinepub/9699919799/fifts/fprintf.html
R .. GitHub DỪNG GIÚP ICE

8

Các specifier chính xác cho dài không dấu là %lu.

Nếu bạn không nhận được giá trị chính xác mà bạn đang mong đợi thì có thể có một số vấn đề trong mã của bạn.

Vui lòng sao chép mã của bạn ở đây. Sau đó, có lẽ ai đó có thể cho bạn biết tốt hơn vấn đề là gì.


-5

Tôi đã từng gặp vấn đề tương tự. Hãy thử "% ul", nó hiệu quả với tôi.


6
Câu hỏi này đã được trả lời rộng rãi hơn 8 năm trước. Vui lòng đảm bảo rằng một câu trả lời mới sẽ thêm thông tin mới và quan trọng hơn là chính xác.
Gerhardh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.