2009-09-20 65 views
2

我有一個非常簡單的程序,只是將整數換行符打印出來,每個數字後面都會顯示一個「D」。簡單的程序添加「D」到輸出

樣品輸入:
d [輸入]
E [輸入]
F [輸入]
按Ctrl-d [輸入]

示例輸出:
3D

我是什麼做錯了?

這是從C編程語言第2版逐頁, 19:

#include <stdio.h> 

main() 
{ 
    int c, nl; 
    nl = 0; 

    while ((c = getchar()) != EOF) 
     if (c == '\n') 
      ++nl; 
    printf("%d\n", nl); 
} 
+0

你確定D不是來自Ctrl + D嗎? – 2009-09-20 05:04:03

+0

你在哪個平臺上運行? MacOS X有任何機會? – 2009-09-20 05:06:31

+0

感謝您的回答,每個人。我正在運行OpenBSD 4.5。 – deadguy 2009-09-23 00:37:42

回答

4

我認爲d控制檯輸出^ d作爲其標準回波邏輯,之前經過相應炭(或者更確切地說,這裏缺乏炭,即EOF狀態),以getchar使來自Ctrl鍵D. (),然而,理所當然地,不發送cr/lf。 C程序然後發送它的3,等等...

退出之前通過鍵入超過9 CR嘗試程序,並且問題應該「消失」,即不顯示。

+0

我真的不知道從未見過這樣的東西 – RageZ 2009-09-20 05:04:40

+0

你看起來是正確的。您可以通過在printf字符串的開頭添加一些額外的換行符來確認此解釋,如下所示:printf(「\ n \ n%d \ n」,nl); shell打印^ D,printf用其輸出覆蓋插入符號。 – 2009-09-20 05:09:54

+0

@RageZ:我現在也沒有,但是在MacOS X(10.5.8)上進行測試顯示了這種行爲 - 這讓我大吃一驚。 – 2009-09-20 05:11:37

0

這對GCC來說工作得很好,無論是輸入管道還是手動輸入,並用^ D完成。

 
$ ./a.out 
1 
2 
3 
3 
$ echo -ne "1\n2\n3\n" | ./a.out 
3 

它可能像@mjv說,和控制檯呼應d還給你 - 您使用的是Windows,對不對?我認爲這對Windows控制檯是正常的。

+0

馬克,在Windows上它是發送EOF的ctrl + z。 – 2009-09-20 06:27:13

2

更改打印線這樣:

的printf( 「\ n%d \ n」 個,NL);

然後你會看到,當你點擊ctrl-d時,你會得到「^ D」。只是因爲你沒有按下ctrl-D後跟Enter,那麼它不在你的原始程序的換行符上。並不是所有的系統都會將ctrl-d回顯給你,但是它在OS-X上有例外。所以如果你打印一個一位數的數字,它最終會搞亂輸出。你必須解決它。

+0

你碰巧知道是否有一個「stty」設置來控制它? – 2009-09-20 05:13:02

+1

回答我自己的評論/問題:'stty echoctl'使它和'stty -echoctl'禁用它(控制字符的回顯,例如'^ D',即)。 – 2011-11-29 23:11:19