2014-07-15 66 views
1

我一直在使用Brian W. Kernighan和Dennis M. Ritchie的C編程語言,並且在字符輸入和輸出方面,特別是在文件複製方面。書中的示例複製用戶的輸入並將其放在屏幕上

#include <stdio.h> 

int main(void) 
{ 
    int c; 

    c = getchar(); 

    while (c != EOF) 
    { 
     putchar(c); 

     c = getchar(); 
    } 

return 0; 
} 

完美地工作。

但我還是決定把我自己的旋轉上的東西,把它改寫了一下:

#define <stdio.h> 

int main(void) 
{ 
    int c; 

    printf("Please enter a digit: "); 
    c = getchar(); 

    while (c != EOF) 
    { 
     printf("The digit entered was: "); 
     putchar(c); 

     printf("Please enter a digit: "); 
     c = getchar(); 
    } 

return 0; 
} 

編譯和執行後,我的代碼的結果是:

Please enter a digit: 9 
The digit entered was: 9Please enter a digit: The digit entered was: 
Please enter a digit: *cursor is here* 

輸入應該是:

Please enter a digit: 9 
The digit entered was: 9 

Please enter a digit: *the cursor should be here* 

另外,我有一點理解EOF的問題。如果有人能夠幫助我解決這些問題,那將是非常棒的。

謝謝!

+0

什麼是你不明白EOF? –

回答

1

大多數「終端」不會將鍵盤輸入發送到「一次一個鍵」的程序。相反,終端將等待回車鍵,然後將所有按下的鍵(直到該點)發送到目標程序。因此,問題代碼受到獲取換行符\n作爲輸入,以及數字。

下面扔掉所有非數字值的代碼(也允許EOF值):

#include <stdio.h> 
#include <ctype.h> 

int main(void) 
    { 
    int c; 

    do { 
     c=0; 
     /* Get user input */ 
     printf("Please enter a digit: "); 
     while(!isdigit(c) && EOF != c) 
     c = getchar(); 

     /* Produce output. */ 
     if(c == EOF) 
     printf("\n"); 
     else 
     printf("The digit entered was: %c\n", c); 
     } while (c != EOF); 

    return 0; 
    } 

編譯上述(Linux的GCC例如:gcc -Wall -o test *.c

然後執行:(Li​​nux的例如:./test

Please enter a digit: 5 
The digit entered was: 5 
Please enter a digit: 6 
The digit entered was: 6 
Please enter a digit: <CTRL-D> 

<CTRL-D>通常產生EOF條件。

0

因爲ENTER值 「\ n」(ASCII值10)將

getchar(c); 

所以要得到它會做的

printf("The digit entered was: "); 
printf("Please enter a digit: "); 
0

那麼第二次,它是關於新的麻煩在輸入控制檯屏幕的同時輸入標準輸入的字符。

讓我問你:

有了,你說完美運行的代碼,你可能已經嘗試了一些像"Hello!"輸入假設,或者只是一個字符像"9"在你的榜樣。您鍵入下來'H'然後'e'然後'l' ...然後'!'然後打輸入鍵,或者只是'9'然後打輸入鍵

之後,你有你的屏幕上顯示如下:

Hello! 
Hello! 
_ 

最後底線存在指示閃爍的光標。我的問題是:爲什麼在那裏?爲什麼它不是最後一個'!'旁邊?

9同樣的故事,這將是你的屏幕上的東西:

9 
9 
_ 

嗯,這裏的原因:這是因爲你的程序打印一個或多個字符,你不能直接看到,一個新 - 行字符'\n'。證明:如果沒有打印,則下劃線將閃爍在'!''9'旁邊。

當您點擊輸入密鑰時,除了您在該會話中輸入的內容之外,還會輸入新行字符'\n'的標準輸入。標準輸入獲得所有這些,並且getchar();逐一消耗它們。

在你的代碼,你的預期不工作,你喂的標準輸入與'9' '\n'getchar();首先獲取'9'然後'\n',然後它看起來更多,但沒有任何更多。只有那時(當沒有更多的時候),它會向你要求更多。

這就是今天的故事...

得到什麼你期待,你應該做別的事情,我也不會告訴你,直接,這是一個很好的鍛鍊。我可以暗示你應該使用另一個while循環,在你已有的循環中檢查'\n'遭遇。

EOF只是一個特殊字符,或者更確切地說是一個值,表示在文件結尾的特殊情況。對於標準輸入,我猜可以用Linux上的CTRL + D組合鍵發出,在Windows上是CTRL + Z。使用該組合,然後按回車應該可以讓你擺脫外部循環。

0

你被輸入中的尾隨換行符絆住了;當你輸入9和命中Enter輸入流你的代碼從讀取將包含編碼爲人物,9和換行符(ASCII碼,這將是值的序列。[57,10]) 。下面是它的分解:

  1. 代碼提示您輸入一個數字
  2. 您鍵入9並按下回車鍵
  3. 輸入數據流中包含的字符{'9', '\n'};
  4. getchar返回從輸入流中,這是'9'
  5. '9'下一個可用的字符不等於EOF,讓你從輸入打印數字,提示下一個字符
  6. getchar回到下一個可用字符流,這是'\n'
  7. '\n'不等於EOF,讓您打印的字符並提示下一個字符
  8. 輸入流現在是空的,所以getchar塊,直到您輸入其他內容。

可以相對容易地解決這個問題:

#include <ctype.h> 
... 
while (c != EOF) 
{ 
    printf("The digit entered was: "); 
    putchar(c); 

    printf("Please enter a digit: "); 
    do 
    { 
     c = getchar(); 
    } while (isspace(c)); 
} 

直到它看到的東西,不是換行或其他空白字符最後一點do循環將讀取輸入流中的字符。您可以添加額外的檢查,以確保輸入的字符真的是一個數字[0-9]:

while (c != EOF) 
{ 
    printf("The digit entered was: "); 
    putchar(c); 

    do 
    { 
     printf("Please enter a digit: "); 
     do 
     { 
     c = getchar(); 
     } while (isspace(c)); 

     if (!isdigit(c)) 
     printf("%c is not a digit!\n"); 

    } while (!isdigit(c)); 
} 

現在,一個需要注意的;什麼你存儲在c不是9,但是編碼爲字符'9',這在ASCII如果你想存儲c9,你會是整數值57。必須做一些不同的事情。

相關問題