2013-02-09 51 views
0

所以我正在處理一些事情,需要我讓用戶在命令窗口中輸入儘可能多的數據(包括新行),然後按CTRL + D(EOF字符)後應該能夠打印出輸入的所有內容。使用stdin等待EOF

我能夠弄清楚如何做到每一個新行。

#include <stdio.h> 

int main() 
{ 
    int C; 

    C = getc(stdin); 

    while(C != EOF) 
    { 
    putc(C, stdout); 
    C = getc(stdin); 
    } 

    return 0; 
} 

我也只能使用getc和putc。最終,我想讓用戶輸入儘可能多的數據,然後根據他們使用命令發送的標誌,我將修改使用getopt提供的輸入。

編輯:抱歉忘了添加我的問題。我希望能夠做的是等待用戶輸入他們的所有輸入,然後全部打印出來,而不是逐行輸出。我將如何去做這件事。

+0

那麼,到底什麼是你的問題? – 2013-02-09 23:59:53

+1

在Unix中沒有「EOF字符」,會發生什麼情況是,如果用戶將ctrl-D鍵入到tty中,則會將其作爲文件結束符來處理從中讀取的進程。 – vonbrand 2013-02-10 00:01:52

+0

首選變量名稱的小寫字母。 – pmg 2013-02-10 00:02:23

回答

3

你將需要一些方法來緩衝用戶的輸入(因爲他們可能會打出一個完整的小說之前擊中Ctrl + D)。

這裏有一個如何做到這一點的例子(注意閱讀字符一個字符是非常緩慢的,並使用printf不會處理嵌入完全無效,所以你可能要在「真實」的代碼,使用readwrite代替):

size_t bufsize = 1024; // starting size 
char *buf = malloc(bufsize); 
off_t i = 0; 
char c; 

while((c = getc(stdin)) != EOF) { 
    buf[i++] = c; 
    if(i == bufsize) { 
     bufsize *= 2; // double buffer size to avoid constant reallocation 
     buf = realloc(buf, bufsize); 
     if(!buf) { 
      fprintf(stderr, "YOU TYPED TOO MUCH\n"); 
      exit(-1); 
     } 
    } 
} 

buf[i++] = 0; 
printf("%s", buf); 
+0

好奇:爲什麼'off_t i = 0;'而不是'size_t i = 0;'?輕微:在buf [i ++] = 0;'中不需要'++'。 – chux 2015-01-27 22:39:02