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

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

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

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

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

【问题讨论】:

标签: c


【解决方案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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-15
    • 2011-09-14
    • 2012-10-31
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多