2013-10-14 50 views
5

我正在閱讀K & R的The C Programming Language,並且對putchar和getchar感到困惑。我製作了一個程序,您可以輸入10個字符,程序將其打印回屏幕。Putchar和Getchar in C

#include <stdio.h> 

int main() 
{ 
    int i; 
    int ch; 
    for(i = 0; i < 10; i++) 
    { 
     printf("Enter a single character >> "); 
     ch = getchar(); 
     putchar(ch); 
    } 

    return 0; 
} 

我希望得到這樣的輸出:

Enter a single character >> a 
a 
Enter a single character >> b 
b 

...等等10倍,但是這是我得到的輸出:

(我進入2個字符後停止)
Enter a single character >> a 
aEnter a single character >> 
Enter a single character >> b 
bEnter a single character >> 
Enter a single character >> 

不確定爲什麼我的輸入字符與固定字符串結合並被輸出。

此外,我不太確定爲什麼整數用於存儲字符。

回答

4
putchar(ch); 

只是打印單個字符和下面的printf繼續在同一行內。只需添加:

putchar('\n'); 

putchar(ch);之後,執行printf之前,這將顯式地啓動新的生產線。此外,您也應該採取'\n'從你輸入的字符之後,在那裏停留了輸入:

for(i = 0; i < 10; i++) 
{ 
    printf("Enter a single character >> "); 
    ch = getchar(); 
    getchar();  // <-- "eat" new-line character 
    putchar(ch); 
    putchar('\n'); // <-- start new line 
} 
+1

感謝您的回覆,但代碼仍然不起作用,「輸入單個字符>>」在不應該出現時仍會打印兩次。如果你看看我的主帖和最後一個代碼塊,你可以在第二行看到我的意思,char a已經加入到字符串「輸入單個字符>>」,然後「輸入單個字符」 「字符串會立即再次打印到屏幕上。 –

+0

@CSStudent:我明白了。現在檢查我的答案:) – LihO

4

您不打印新行。在putchar(ch);之後,您應該使用putchar('\n');打印新行。

+1

感謝您的答覆,但代碼仍然不工作,「輸入一個字符>>」依然打印了兩次,當它不該不會的。如果你看看我的主帖和最後一個代碼塊,你可以在第二行看到我的意思,char a已經加入到字符串「輸入單個字符>>」,然後「輸入單個字符」 「字符串會立即再次打印到屏幕上。 –

2

用戶終端可以在規範和非規範的模式操作。默認情況下,它以標準模式運行,這意味着標準輸入可以逐行使用(不是逐個符號)。有問題的用戶輸入一些東西(讓它爲字母'a',十六進制中的0x61)並按下輸入(十六進制中的新行字符'0x0A')。 Ascii表是here。所以這個動作給一個程序提供了兩個符號。正如人類中提到的,getchar()按符號逐個讀取它。所以循環迭代兩次爲一個字符。要看到什麼是在使用去下面的程序(+循環計數器輸出,+字符代碼輸出):

#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 
    int i; 
    char ch; 
    for(i = 0; i < 10; i++) 
    { 
    printf("Enter a single character %d >>", i); 
    ch = getchar(); 
    printf("Ch=0x%08X\n", ch); 
    /*putchar(ch);*/ 
    } 

    return 0; 
} 

輸出:

┌─(02:01:16)─([email protected])─(~/tmp/getchar) 
└─► gcc -o main main.c; ./main 
Enter a single character 0 >>a 
Ch=0x00000061 
Enter a single character 1 >>Ch=0x0000000A 
Enter a single character 2 >>b 
Ch=0x00000062 
Enter a single character 3 >>Ch=0x0000000A 
Enter a single character 4 >>^C 

所以程序獲取兩個符號並打印它們。新行符號不可見。因此,在用戶看到一個奇怪的額外的行。 有關不同終端模式的詳細說明以及如何進行調整,請參閱here

另外stty實用程序在使用終端選項時會很有用(「icanon」表示終端使用規範模式還是不使用)。

而關於將char作爲int存儲在getchar()輸出中 - 有關類似主題,請參見我的answer

0

循環偶數次,getchar()不是從鍵盤輸入,而是從先前輸入的命中中獲取的,所以你也會注意到循環只執行了5次。因此,您必須清除緩衝區,即按下輸入,以便可以在ch中輸入新字符。

for (i = 0; i < 5; i++) 
    { 
     printf("\nEnter a single character >> "); // new line 
     ch = getchar(); 
     while (getchar() != '\n'); //Clearung buffer. 
     putchar(ch); 
    } 
0

不知道是否理想,但這個工作:

#include <stdio.h> 
    int main() 
    { 
     int i; 
     int ch; 
     for(i = 0; i < 10; i++) 
     { 
      printf("Enter a single character >> "); 
      getchar(); 
      ch=getchar(); 
      putchar(ch); 
     } 

     return 0; 
     } 
+0

這是錯誤的。你的第一個'getchar()'會吃掉用戶輸入,'ch'只會得到一個換行字符 – Cyril

+1

我明白了,謝謝:) –