2014-11-03 53 views
0

是否可以打印用戶輸入而不使用字符數組?不使用字符數組打印輸入

#include<stdio.h> 
main() 
{  
    int ch; 
    while((ch = getchar()) != EOF){ 
      putchar(ch); 
    } 
} 

例如,我要進入:

當輸入字符參與此代碼不能正常工作

abcd 
efgh 
ij 

,我想輸出是相同的:

abcd 
efgh 
ij 

但是當我輸入第一行時,程序也應該輸出該行(在我的輸入之後)。它是這樣的:

abcd (my input) 
abcd (output) 
efgh (my input) 
efgh (output) 
ij (my input) 
ij (output) 
+6

無法根據給定條件獲得預期輸出! – haccks 2014-11-03 19:15:39

+0

haccks說,你必須重新考慮你的算法 – 2014-11-03 19:17:11

+0

你能澄清你的要求嗎?當你說'輸入三行輸入'時,你的意思是你運行你的程序並在標準輸入中輸入三行?你希望你的程序能夠回顯數據,但是:你想只看到一個數據副本,還是希望看到兩個數據副本,一個在另一個之前,或者你想看到交錯輸入和輸出線?如果輸入從文件重定向而不是從鍵盤輸入,您希望發生什麼?你是在類Unix的機器上,還是在Windows上,或者其他的東西(因爲有些建議可能需要POSIX)? – 2014-11-03 21:16:06

回答

1
#include<stdio.h> 

int main(){ 
    FILE *fp = fopen("echo.tmp", "w+"); 
    int ch; 
    while((ch = getchar()) != EOF){ 
     fputc(ch, fp); 
    } 
    fflush(fp); 
    rewind(fp); 
    while((ch = fgetc(fp)) != EOF){ 
     putchar(ch); 
    } 
    fclose(fp); 
    remove("echo.tmp"); 
    return 0; 
} 
1

爲了好玩,不切實際的遞歸解決方案。

閱讀char後,將它放在堆棧上並遞歸。

完成後(EOF),通過堆棧遞歸。

#include <stdio.h> 

typedef struct prev_T { 
    struct prev_T *prev; 
    int ch; 
} prev_T; 

void put1(prev_T *s) { 
    if (s != NULL) { 
    // Swap this line and the next if you want to print in reverse. 
    put1(s->prev); 
    putc(s->ch, stdout); 
    } 
} 

void get1(prev_T *s) { 
    prev_T node; 
    node.ch = getchar(); 
    if (node.ch == EOF) { 
    put1(s); 
    } else { 
    node.prev = s; 
    get1(&node); 
    } 
} 

    int main(void) { 
    get1(NULL); 
    return 0; 
    } 
0

一個更不切實際的遞歸解決方案:

#include <stdio.h> 
#include <stdarg.h> 

void unwind(va_list ap) 
{ 
    int ch = va_arg(ap, int); 
    if (ch == EOF) 
     return; 

    va_list a2 = va_arg(ap, va_list); 
    va_end(ap); 
    unwind(a2); 
    putchar(ch); 
} 

void package(int dummy, ...) 
{ 
    va_list ap; 
    va_start(ap, dummy); 

    int ch = getchar(); 
    if (ch == EOF) 
     unwind(ap); 
    else 
     package(0, ch, ap); 
} 

int main() 
{ 
    package(0, EOF); 
} 
+0

你甚至可以讓'dummy'成爲某種輸入參數,例如。最大長度 – 2014-11-04 01:24:57

0

簡單的,非遞歸,非常實用,從你給輸入完成你想要的輸出方法是讀單個字符並立即輸出,對特殊字符進行特殊處理。例如,您可以測試字符值13,以在按下回車鍵時輸出換行符,並查找其他特殊字符來表示輸入結束。