编写一个从标准输入读取并打印到标准输出的 c 程序,没有内置的行长限制

Posted

技术标签:

【中文标题】编写一个从标准输入读取并打印到标准输出的 c 程序,没有内置的行长限制【英文标题】:Writing a c program that reads from stdin and prints to stdout with no built-in limit of the line's length 【发布时间】:2019-04-05 23:22:14 【问题描述】:

我正在阅读 Kenneth Reek 的 Pointers On C 的书,偶然发现了以下问题:

编写一个从标准输入读取行的程序。每一行都印在 标准输出前面加上它的行号。尝试编写程序,以便 它对可以处理多长时间没有内置限制。

我无法理解的是如何在不使用缓冲区存储输入之前将其作为输出传递。

我曾尝试将标准函数用于 io 操作,例如 fgetsscanf,但它们似乎都需要一个目标变量来存储输入,然后才能将其传递给 printf 函数。

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

正如Taegyung 指出的,一个简单的方法是:

int c;
int LineNumber = 1;
printf("%d ", LineNumber);
while ((c = getchar()) != EOF)

    putchar(c);
    if (c == '\n')
        ++LineNumber;

一个问题是这将为最后一个“空”行打印一个行号。如果我们想避免这种情况,那么我们只想在(a)我们刚刚开始一个新行,并且(b)文件中有另一个字符时才打印一个行号:

#include <stdbool.h>
…

int c;
int LineNumber = 0;
bool AtStartOfLine = true;
while ((c = getchar()) != EOF)

    if (AtStartOfLine)
        printf("%d ", ++LineNumber);
    putchar(c);
    AtStartOfLine = c == '\n';

【讨论】:

感谢您的回答,它向我展示了一些使我的代码更短的好做法;)【参考方案2】:

我最终编写了以下代码:

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

int main()     
    int ch;
    int line_number = 0;
    bool found_newline = true;  

    while ((ch = getchar()) != EOF)        
        if (found_newline) 
            printf("%d ", ++line_number);
        putchar(ch);        
        found_newline = ch == '\n';
    
    return 0;

只是将它发布在这里,以供将来可能会看到它的每个人使用。

【讨论】:

以上是关于编写一个从标准输入读取并打印到标准输出的 c 程序,没有内置的行长限制的主要内容,如果未能解决你的问题,请参考以下文章

使用 QProcess 读取标准输出

在 c/c++ 中编辑从标准输入打印在标准输出上的文本

C语言试题183之编写一个程序,从标准的输入读取一些字符,并统计下各类字符所占的百分比

从标准输入读取和打印矩阵

打印输出 echo、tee、cat

Python子进程将数据定向到标准输入