2016-04-29 16 views
6

Tôi đang cố gắng tìm giới hạn cho phép đối với số ký tự được in theo printf() trong tiêu chuẩn C. Tôi chỉ tìm thấy answer trong diễn đàn thảo luận, cho biết INT_MAX.Printf() - các ký tự in giới hạn

Ví dụ, tôi đã kiểm tra như sau:

#include <stdio.h> 

// INT_MAX 2147483647 

int main() 
{ 
    int x=3; 

    int y = printf("%2147483647d \n\n", x); --> Confirms INT_MAX ? 

    // If I change the above to 2147483648, y in set to -1 
    printf("y = %d\n\n", y); 

    return 0; 
} 

Tôi muốn hỏi tại sao printf() giới hạn bởi INT_MAX? Bất cứ ai có thể chỉ ra một lý do tiêu chuẩn C hoặc tham chiếu mã nguồn?

Sửa

Câu trả lời gần nhất tôi thấy được cho fprintf(). Tại link này, trên trang 568, đề cập đến nó (dưới hành vi undefined):

The number of characters or wide characters transmitted by a formatted output 
function (or written to an array, or that would have been written to an array) is 
greater than INT_MAX. 

sẽ ở trên biện minh cho printf() không?

+0

'printf()' bị giới hạn bởi 'INT_MAX' không đáng ngạc nhiên. Khi nghi ngờ, nó bị giới hạn bởi 'INT_MAX'. –

+0

Nhưng lý do là gì? – Jake

+2

Nó rõ ràng sử dụng 'int' để lưu trữ số lượng ký tự được in. Bạn không thể lưu trữ giá trị lớn hơn 'INT_MAX' trong' int'. –

Trả lời

1

Vâng, nếu bạn in với định dạng specifier% d, cho biết số nguyên, tất nhiên số lượng in tối đa của bạn sẽ là INT_MAX. Nhưng ví dụ của bạn là sai. Bạn đang cố gắng nói với nó để in INT_MAX chữ số trên một số, nhưng điều đó, tất nhiên, vượt xa giá trị số thực tế INT_MAX.

Tại sao ví dụ của bạn không thành công, tôi giả sử printf() lưu trữ số lượng chữ số để in trong chính số nguyên.

+0

Vâng số được in là 3. Tôi đã thử nó với '% 2d', đầu ra là' 3'. Vì vậy, không gian in của nó (1 ít hơn số tôi đã chỉ định) và sau đó là 3. Nó vẫn còn sai? – Jake

+0

Cũng sai của nó theo nghĩa là bạn sẽ không bao giờ có thể in một số với INT_MAX chữ số với nó, do đó, xác định rằng nhiều không gian chỉ là sẽ có tác dụng có một loạt các không gian bạn không cần. – Magisch

+0

Bạn có thể xem bản chỉnh sửa tôi đã thực hiện không? – Jake

0

"Printf chỉ in kết quả".

Nói cách khác, số ký tự mà printf có thể in phụ thuộc vào định dạng chỉ định được chỉ định.

Cú pháp tiêu chuẩn cho printf là,

int printf (const char * format, ...); 

đây dựa trên "định dạng", giới hạn số ký tự được thiết lập.

từ bạn đoạn mã:

int y = printf("%2147483647d \n\n", x); 

vì, giá trị quy định là tốt với phạm vi.

Tương tự, khi bạn thay đổi giá trị thành 2147483648, nó vượt quá phạm vi.

1

printf được ghi là trả về số ký tự được in hoặc -1 trong trường hợp hoặc lỗi. Kiểu trả về của nó là int. Số lượng tối đa bạn có thể lưu trữ là intINT_MAX.

Điều gì sẽ xảy ra nếu bạn cố in nhiều ký tự hơn? Sau đó, printf không thể hoàn thành hợp đồng của mình: để trả lại số ký tự được viết. Tiêu chuẩn không nói phải làm gì khi hợp đồng không thể thực hiện được, vì vậy hành vi trong trường hợp này là không xác định bởi không được xác định trong tiêu chuẩn.

0

Điều này phải là nhận xét nhưng do hạn chế về không gian, tôi phải gửi câu trả lời này làm câu trả lời.

#include<stdio.h> 
#include<limits.h> 
#include<malloc.h> 
struct ec 
{ 
    char *c; 
}; 

int main(void) 
{ 
    printf("INTMAX : %d\n",INT_MAX); 

    struct ec obj; 
    size_t max=(size_t)INT_MAX+1000; 
    size_t i; 
    obj.c=malloc(max*sizeof(char)); 
    if(obj.c==NULL) 
    { 
     printf("Can't allocate such big memory chunk\n"); 
     exit(0); 
    } 

    for(i=0;i<(max-1);i++) 
     obj.c[i]='0'; 
    obj.c[i]='\0'; 
    printf(obj.c); // This appear to print fine 

    /* Not bothered to put a free(obj.c) here*/ 
    return 0; 
} 

Tôi tin rằng vấn đề là nhiều hơn với cách thức trả về chức năng printf như thế nào int. Giá trị trả về là số ký tự được in và do đó nó sẽ được tăng lên cho mỗi lần in ký tự. Tôi không thể nghĩ điều gì sẽ xảy ra khi printf in (INT_MAX + 1) ký tự thứ n

Lưu ý: Tôi bỏ qua cảnh báo trình biên dịch.

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