2010-05-12 68 views
4

我正在編譯用C編寫的簡單程序,我在Windows 7和MacBook Pro中都使用Eclipse作爲IDE。很簡單的程序,我的朋友寫了,要我幫他:在Unix和Windows下運行程序

int a = 0; 
char b[2]; 
printf("Input first class info:\n"); 
printf("Credit Hours: \n"); 
scanf("%d", &a); 
printf("Letter Grade: "); 
scanf("%s", b); 

所以,當我在我的Mac上運行此,每行打印,當我遇到的scanf(),我可以輸入並繼續按預期。在Windows中,我必須輸入所有內容,然後它將打印所有行。我不知道爲什麼會發生這種情況......在這裏,Windows和Mac有什麼不同?

的Mac:

Input first class info: 
Credit Hours: 4 
Letter Grade: B+ 

的Windows:

4 
B+ 
Input first class info: 
Credit Hours: 
Letter Grade: 

感謝, 斯托伊奇

+0

如果在命令行而不是通過Eclipse運行程序,會發生什麼情況? – caf 2010-05-12 04:05:12

回答

3

在Windows上提到的this thread

您需要fflush(stdout)您的來電printf()後。

同時,由於bug 27663,做printf()到Eclipse控制檯不沖水,直到printf()函數的緩衝區已滿。
這對Windows控制檯有各種相關的錯誤:bug 102043bug 121454

+0

謝謝修復它。在scanf()之前的每個printf()之後是否需要刷新? – Hristo 2010-05-12 04:15:58

+0

@Hristo:在下一行被執行之前,你會希望看到所有數據的時間和地點。我建議不要在每個printf之後盲目地放置fflush,因爲如果在I/O密集型應用程序中過度使用,會降低性能。 – 2010-05-12 04:18:22

+0

@RC:我同意。這是在提到的線程的上下文中。 – VonC 2010-05-12 04:20:51

-1

你想用\r\n而不是\n

+2

不可以。標準輸出在文本模式下打開,這意味着一個普通的'\ n'會被翻譯成任何本地行結尾。 – caf 2010-05-12 04:04:19

+0

@caf,但再一次,Windows是公然的非標準....你幾乎可以期望Windows機器上的任何行爲。 – 2010-05-12 04:05:02

+0

@Michael:它與Windows無關。圖書館是Eclipse的責任。 – 2010-05-12 04:13:48

1

這可能是由於緩衝區緩存的差異。

嘗試:

fflush(stdout); 

您scanfs之前。當你需要看到它時,這將強制輸出被刷新到屏幕上。

1

Windows和Mac緩衝控制檯輸出的方式不同。如果你希望它立刻出現,你需要通過調用

fflush(stdout); 

之後的printf。

1

我的猜測是,在Mac OS X上,「\ n」會導致stdout被刷新,而在Windows上則不然。試試你的報表打印後您的scanf函數語句之前加入以下一段代碼:

fflush(stdout); 
0

就像費奧多爾說,這是最有可能是行結束的問題。

在Windows上,行結尾是「\ r \ n」(回車後跟換行符)。

在Mac OSX上,行尾僅爲「\ r」,但「\ r \ n」也適用,因爲它包含「\ r」。

在Unix/Linux上,行尾通常只是「\ n」。

0

除了需要回答fflush() - 您的代碼包含緩衝區溢出。進入b的scanf()寫入3個字節 - { 'B', '+', '\0' } - 並且陣列沒有足夠空間存儲NUL終止符。您需要一個3字符寬度的緩衝區,或者使用scanf(%s)以外的值來讀取2個字符。