我需要一些关于如何反转标准输入内容的建议。这是我的代码中处理反转标准输入的部分:

int reversestdin(FILE *file)
{
    int a, b;
    int lineas=0;
    while ((a=fgetc(stdin)) !=EOF)
    {
        if (a=='\n')
            lineas++;
    }
    for(b=0; b<lineas; b++)
    { 
        rewind(stdin);
        int d,len, e;
        char str[2048], *ptr;
        for(e=0; e<=b; e++)
        { 
            fgets(str, 2048, stdin);
        }
        ptr=str;
        for(d=0; d<2048; d++)
        {
            if(*ptr=='\n')  break;
            if(*ptr=='\0')  break;
            ptr++;
        }
        len=d;
        ptr--;
        for(d=len; d>0; d--)
        {
            printf("%c", *ptr--);
        }

        printf("\n");
    }
    return 0;
}

我还有一个名为 example1 的 .txt 文件,其中包含以下内容:

LINE 1.1
LINE 1.2

LINE 1.4

这段代码在我执行时有效 ./myprogram < example1.txt. 。它输出

1.1 ENIL
2.1 ENIL

4.1 ENIL

但是,如果我执行 echo "This text should be reversed" | ./myprogram 它输出:

(

就是这样。一个开放的括号。我发现,如果我省略代码中计算行数的部分,而只是手动说有 1 行,它就可以工作(当然是 1 行)。

int reversestdin(FILE *file)
{
    int a, b;
    int lineas=1;
    //while ((a=fgetc(stdin)) !=EOF)
    //{
        //if (a=='\n')
            //lineas++;
    //}
    for(b=0; b<lineas; b++)
    { 
        rewind(stdin);
        int d,len, e;
        char str[2048], *ptr;
        for(e=0; e<=b; e++)
        { 
            fgets(str, 2048, stdin);
        }
        ptr=str;
        for(d=0; d<2048; d++)
        {
            if(*ptr=='\n')  break;
            if(*ptr=='\0')  break;
            ptr++;
        }
        len=d;
        ptr--;
        for(d=len; d>0; d--)
        {
            printf("%c", *ptr--);
        }

        printf("\n");
    }
    return 0;
}

现在它输出

desrever eb dluohs txet sihT
有帮助吗?

解决方案

一、倒带 stdin 不支持,除非(理论上)它已从输入文件重定向。既然没有办法(无论如何,我知道)知道这已经发生了,所以不要费心去尝试。

也就是说,与明显流行的观点相反,您不必缓冲整个输入。您仍然可以一次缓冲它:

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

int main()
{
    int buffer[2048], ch, lines=0, i=0;
    do
    {
        ch = fgetc(stdin);
        if ((ch == '\n') || 
            (ch == EOF && i > 0) || 
            (i == (sizeof(buffer)/sizeof(*buffer)-1)))
        {
            ++lines;
            while (i != 0)
                fputc(buffer[--i], stdout);
            fputc('\n', stdout);
        }
        else
        {
            buffer[i++] = ch;
        }
    } while (ch != EOF);

    return 0;
}

很确定这会满足您的需求(或者接近它,无论如何)

其他提示

你无法倒回 stdin!

你应该修改你的逻辑,这样你就可以读到 EOF 而不是尝试事先计算行数。

另一件要注意的事情是你的语句计算行数......

编辑:我还建议将 stdin 设置为等于可以使用操作的变量。所以有类似的东西 temp = stdin 所以你将始终拥有初始的标准输入,并且可以根据需要进行操作的临时数据,如果你需要返回,你仍然有标准输入。

while ((a=fgetc(stdin)) !=EOF)
    {
        if (a=='\n')
            lineas++;
    }

如果您考虑一下,您输入的那一行没有换行符,因此您的程序仍然认为有 0 行。所以我要么最初设置 lineas = 1 或者如果你不知道是否会有任何内容,你可以检查一下其中是否有任何字符,所以过了一会儿,或者其中的某个地方说 if lineas == 0 then check for characters

另一件需要考虑的事情是 神奇数字. 。这就是你的2048。我会考虑通过将 2048 设置为“全局”变量来解决这个问题。

建议流程

用你的 while 声明而不是你的 for 陈述。但是, while(a != EOF) 其中 a 是 char 所以继续做 fgetc. 。然后只需将其放入数组末尾的大小为 2048 的字符数组中,然后向后工作(或者您可以将其放入从 0 到任意多个字符的字符数组中,然后有一个向后的 for 循环...也就是说计数器会很方便)。但你想要有一个 if a=='\n' 然后向后打印该行并将数组索引重置为 2048。我还建议有一个计数器来计算字符数,这样当在数组中向后移动时,您就不必遍历整个过程,直到 2048-counter.

这应该可以帮助您获得更简洁的流程。您也不需要那么多代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top