不使用char数组打印输入

时间:2014-11-03 19:14:22

标签: c

是否可以打印用户输入的输入而不使用char数组?

当涉及Enter字符时,此代码不起作用:

#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)

4 个答案:

答案 0 :(得分: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 :(得分: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;
  }

答案 2 :(得分: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);
}

答案 3 :(得分:0)

从您提供的输入中完成预期输出的简单,非递归,非常实用的方法是读取单个字符并立即输出,并对特殊字符进行特殊处理。例如,您可以测试字符值13以在按下回车键时输出换行符,并查找其他特殊字符以表示输入结束。