2013-10-09 18 views
6

Khi tôi chạy chương trình dưới đây, tôi không nhận được bất kỳ đầu ra nào.hành vi bất thường với printf với vòng lặp vô hạn trong khi

#include <stdio.h> 

int main() 
{ 
    printf("hello"); 
    while(1) 
    { 

    } 
    return 0; 
} 

trong khi nếu tôi chỉnh sửa các lệnh printf để thêm một nhân vật '\ n' vào cuối của chuỗi, sau đó sản lượng dự kiến ​​đến. những gì đang xảy ra trong mã đầu tiên? Tôi chỉ đơn giản là không thể hiểu được nó.

+0

gọi 'fflush (stdout)' btw bạn có vòng lặp vô hạn. –

+3

Đầu ra được đệm. Bạn cần hoặc là một '\ n' ở cuối chuỗi để làm cho nó in ra, hoặc sử dụng' fflush (stdout) 'sau khi' printf' của bạn như @GrijeshChauhan đề xuất. Có những hoạt động khác mà tuôn ra bộ đệm đầu ra là tốt, chẳng hạn như một chức năng đầu vào ('getchar' hoặc' scanf') nhưng nó không rõ ràng từ đoạn mã của bạn những gì vòng lặp của bạn đang làm. – lurker

+0

có thể trùng lặp của [Tại sao chương trình không thực thi lệnh printf cuối cùng?] (Http://stackoverflow.com/questions/11277796/why-does-program-not-execute-final-printf-statement) – lurker

Trả lời

10

Điều này là do stdout là dòng đệm, tức là đầu ra không được ghi vào thiết bị (nhà ga) cho đến khi một dòng đầy đủ đã được thu thập .

Bạn có thể gọi fflush(stdout); để buộc xả bộ đệm vào đầu cuối. Đừng cố gắng xả sạch stdin bằng cách này, điều đó không được phép.

+0

ok nhưng tại sao mã hoạt động mà không có vòng lặp vô hạn và với cùng printf như trên thì? – DesirePRG

+0

+1 để yêu cầu không làm điều này với stdin – fayyazkl

+3

Khi chương trình chấm dứt ngay sau đó, os chắc chắn sẽ xóa bộ đệm đầu ra sớm hơn như trái ngược với không có yêu cầu tuôn ra và chương trình đang được tiếp tục. – fayyazkl

2

thử

printf("hello\n"); 

hoặc

printf("hello"); 
fflush(stdout) 
+0

Bạn nên chỉ ra rằng 'fflush (stdout)' xuất hiện ngay sau 'printf'. – lurker

+0

@mbratch True. Tôi đã chỉnh sửa, cảm ơn. –

0

Bạn nên in dòng mới ở cuối đầu ra. Nếu không, nó sẽ gọi hành vi không xác định (ít nhất là khả năng không xác định).

+1

Bạn có ý gì khi "gọi hành vi (có khả năng) không xác định"? –

0

Sử dụng printf("hello\n");

Để biết thêm thông thấy câu trả lời cho this question.

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