2010-05-17 159 views
12

Để đọc một int sử dụng scanf chúng tôi sử dụng:sử dụng scanf trong C/C++

scanf("%d",&i); 

gì nếu i được lâu không int ??

Lưu ý: khi sử dụng %d với long nó mang lại cho tôi một cảnh báo khó chịu ..

Cảm ơn!

+4

"Điều gì xảy ra nếu' i' không dài int ?? " - Nếu bạn đọc tài liệu thì sao? Thư viện chuẩn được tài liệu cố ý (ở nhiều nơi). Không bao giờ cần phải đăng câu hỏi có thể được RTFM trả lời. http://www.cplusplus.com/reference/clibrary/cstdio/scanf/ – Clifford

+1

@Clifford: Chỉ cho tôi nơi trên trang đó, nó cho biết đó là lỗi nếu loại con trỏ không khớp với những gì được mong đợi? Chắc chắn, nếu bạn truy cập bộ nhớ đúng cách và cách chức năng này hoạt động, rõ ràng là "nên trỏ đến ... đối tượng thuộc loại được chỉ định bởi thẻ định dạng tương ứng" là "mạnh" nên "nhưng không rõ ràng nếu không . Trong tò mò, tôi googled "người đàn ông scanf" ... liên kết đầu tiên nói "phải" thay vì "nên", đó là tốt hơn, nhưng sau đó khi mô tả cờ 'd', nó nói" con trỏ tiếp theo phải là một con trỏ để int "không đề cập đến các công cụ sửa đổi có thể. –

+0

@Dennis; ngoài thực tế là câu hỏi này đã hơn một tuổi và bình luận của tôi chưa bao giờ đưa ra bình luận cho đến bây giờ, 'long' không phải là một biến tố của' int' nó là một kiểu dữ liệu theo đúng nghĩa của nó - ngay cả khi viết 'long int'. Trình định dạng% d định dạng * có * có 'công cụ sửa đổi' cho các loại số nguyên có kích thước khác nhau, và những * được * ghi lại trong liên kết tôi đã cung cấp. Bằng ngụ ý nếu có một định dạng cụ thể định dạng cho 'long' ("% ld "), thì trình định dạng định dạng dành cho' int' sẽ không chính xác, nếu không sẽ không cần định dạng khác. – Clifford

Trả lời

20

Chỉ cần sử dụng

long l; 

scanf("%ld", &l); 

nó mang lại cho tôi một cảnh báo khó chịu ..

Đó là cảnh báo hoàn toàn đúng. Đây là cầu xin cho sự tham nhũng ngăn xếp.

+0

Trong khi mã của bạn chỉ đơn giản là cung cấp cho hành vi không xác định. Bạn cần phải cung cấp cho scanf địa chỉ của biến được đọc vào. –

2
scanf("%ld", &i); 

Bạn cũng có thể sử dụng "%Ld" cho một long long (và tùy thuộc vào trình biên dịch của bạn, đôi khi cũng "%lld").

Hãy xem phần Chuyển đổi của trang man scanf để biết thêm. (Chỉ cần Google nếu hệ thống của bạn không có manpages).

+0

Và không phải trang người đàn ông đó nói rằng những điều bạn đang đọc cần phải được chuyển đến scanf như con trỏ? –

+1

Đối với 'long long (int)', "% lld" là chuẩn (công cụ sửa đổi "L" có nghĩa là 'long double', vì vậy"% Ld "không phải là tiêu chuẩn, mặc dù tôi không nghi ngờ rằng một số triển khai cho phép nó). Các hương vị của BSD đã từng sử dụng công cụ sửa đổi độ dài "q" cho một "tứ diện", chỉ là giá trị 64 bit và tôi chắc chắn nó vẫn được chấp nhận trong một số triển khai dựa trên BSD. Microsoft đã tạo các biến tố độ dài "I64" và "I32" để chỉ định số nguyên 64 bit và 32 bit tương ứng, vì vậy "% I64d" sẽ hợp lệ trong trường hợp đó. Nói cách khác, 'long long' là một mớ hỗn độn của sự nhầm lẫn khi nói đến các hàm I/O được định dạng. : P – Dustin

6

Đối với các vị thần vì lợi ích:

long n; 
scanf("%ld", & n); 
+1

Để thêm vào câu trả lời của Neil, bạn không thể dựa vào một cái gì đó như "% d" để đọc một 'dài int' vì đó chỉ định một' int' chứ không phải là một 'dài (int)'. Không chỉ vậy, 'int' trên một số hệ thống 64 bit có kích thước 32 bit trong khi' long (int) 'có kích thước 64 bit. Nói cách khác, bạn sẽ đọc một số nguyên 32 bit vào vị trí lưu trữ 64 bit. Một ví dụ sẽ được đọc 2147483649. Vì giá trị 32 bit được đọc vào một vị trí 64 bit, 32 bit còn lại với bất kỳ giá trị nào hiện diện, vì vậy bạn có thể nhận được một cái gì đó như 6442450945 nếu bạn có 4294967296 được lưu trữ trong đó ban đầu. – Dustin

3

Mỗi specifier chuyển đổi dự kiến ​​sẽ lập luận tương ứng của nó là một loại hình cụ thể; nếu kiểu của đối số không khớp với kiểu được mong đợi, thì hành vi là không xác định. Nếu bạn muốn đọc vào một chặng đường dài với scanf(), bạn cần phải sử dụng specifier %ld chuyển đổi:

long i; 
scanf("%ld", &i); 

Kiểm tra trực tuyến draft C standard (file .pdf), phần 7.19.6.2, đoạn 11 cho một danh sách đầy đủ kích thước sửa đổi và loại dự kiến.

-1

Kiểm tra điều này, đây là câu trả lời: "% I64d"

+4

Ngoài việc là tiện ích mở rộng không chuẩn, 'long' không phải là loại bit sáu mươi bốn trên nhiều hệ thống. –

Các vấn đề liên quan