回应标准输出的标准输入

时间:2015-10-26 21:02:32

标签: c echo stdout stdin

编写一个程序,该程序将读取标准输入并将每一行回显到标准输出,并在其前面加上行号和选项卡。当您运行此程序并从终端输入行时,输入行将散布输出行。如果您的系统具有输出重定向并且您将输出重定向到文件,则该文件将看起来像带有编号行的输入。

以下是脚本应如何工作的示例。

用户输入粗体。

输入您的文字:

这是第1行。

1这是第1行。

这是第2行。

2这是第2行。

这是输入的最后一行。

3这是输入的最后一行。

最后一行将结束这个过程。

这是我到目前为止所做的:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    printf("Enter your text: \n");
    while (1)
    {
        int ch = getc(stdin);
        fflush(stdout);
        if(ch == EOF) break;

        putc(ch, stdout);
    }
    return 0;
}

我已经尝试了几个小时,现在没有运气,任何帮助都表示赞赏。我基本上不能让我的脚本显示示例输出。我可以让我的脚本将stdin显示为stdout,这就是全部。这是C作业。

7 个答案:

答案 0 :(得分:3)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main(void){
    size_t no = 0;
    bool line_top = true;

    printf("Enter your text: \n");
    while (1) {
        int ch = fgetc(stdin);
        if(ch == EOF) break;

        if(line_top)
            printf("%zu ", ++no);

        line_top = (ch == '\n');

        fputc(ch, stdout);
    }
    fflush(stdout);
    return 0;
}

答案 1 :(得分:2)

要正确完成作业,您需要了解该行是什么。您现有的代码逐个符号地读取和打印数据。这不会打印所要求的数字!

这里有两个解决方案。首先是逐行逐位切换到逐行切换,然后每次打印一行时打印一个递增计数器。其次是逐个符号地读取,但每次从输入中读取新的线符号时都会打印递增的数字。这里的一个小挑战是你需要一个状态 - 也就是说,一旦你看到了新的线条字符,你应该记住这个事实,但不要马上打印这个数字 - 这可能是输入中的最后一行。相反,只要您保存的状态告诉您,就打印一个数字,并在此之后重置标志。

另一个问题是如何处理空行 - 他们是否参与计数器增量 - 但这可能超出了作业范围。

答案 2 :(得分:1)

好的,你应该执行作业所需的内容。这是我能想到的最直接的解决方案:

#include <stdio.h>

int main(void)
{
    char buf[1024];
    int num = 0;

    /* read a line as long as we can read (no error / EOF) */
    while (fgets(buf, 1024, stdin))
    {
        /* print line number */
        printf("%d\t", ++num);

        /* print what we actually read */
        fputs(buf, stdout);
    }

    return 0;
}

试运行:

> ./numlines < numlines.c
1   #include <stdio.h>
2   
3   int main(void)
4   {
5       char buf[1024];
6       int num = 0;
7   
8       /* read a line as long as we can read (no error / EOF) */
9       while (fgets(buf, 1024, stdin))
10      {
11          /* print line number */
12          printf("%d\t", ++num);
13  
14          /* print what we actually read */
15          fputs(buf, stdout);
16      }
17  
18      return 0;
19  }
20  

答案 3 :(得分:1)

代码需要跟踪行的开头。这可以通过使用fgets()或查看个人char阅读来完成。

fgets()可能更快,但它将行长度限制为某个常数。

fgetc()一次获得1 unsigned char(或EOF)。

以下是OP的主要内容,但增加了内部while循环。

不需要太多代码。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  unsigned long long line_number = 0;
  int ch;
  while ((ch = fgetc(stdin)) != EOF) {
    printf("%llu\t", ++line_number);
    while (ch != EOF && fputc(ch, stdout) != '\n') {
      ch = fgetc(stdin);
    }
  }
  return 0;
}

答案 4 :(得分:0)

这是使用#include <string> #include <iostream> using namespace std; int main() { unsigned int i=0; string s; cout<<"Enter your text: "<<endl; while (std::getline(cin,s)) { cout<<++i<<'\t'<<s<<endl; } return 0; } #include <stdio.h> #include <stdlib.h> int main() { int exit=0, i=0, newline=1; printf("Enter your text: \n"); while (!exit) { int ch = getc(stdin); if(newline){ printf("\n%d\t",++i); newline=0; } switch(ch){ case '\n': newline=1; printf("\n"); break; case EOF: printf("\n"); exit=1; break; default: printf("%c",(char)ch); break; } } return 0; } 的c ++解决方案。

Operation

这是一个解决方案:

class RequestContext {

    var httpResponse:NSHTTPURLResponse?
    var data:NSData?
    var JSON:AnyObject?
}

答案 5 :(得分:0)

const int buflen = 1024;
char buffer[buflen];
int count = 0;
while (1)
{
    char* line = fgets(buffer, buflen, stdin);
    if (line == null)
        break;

    fprintf(stdout, "%d: %s\n", ++count, line);
}

答案 6 :(得分:0)

#include<stdio.h>
int main()
{
    char line[1000];
    int lineno=0;
    while((fgets(line,1000, stdin)) != NULL)
    {
        lineno++;
        printf("%d  ",lineno);
        fputs(line, stdout);
    }
}

它将按预期工作。这是一种简单的方法。你不必放入while(1)和if条件并打破循环。