Domanda

Avrei bisogno di qualche consiglio su come invertire il contenuto di stdin.Questa è la parte del mio codice che gestisce l'inversione di stdin:

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;
}

Ho anche un file .txt chiamato example1 con il seguente contenuto:

LINE 1.1
LINE 1.2

LINE 1.4

Questo codice funziona quando eseguo ./myprogram < example1.txt.Esce

1.1 ENIL
2.1 ENIL

4.1 ENIL

Ma, se eseguo echo "This text should be reversed" | ./myprogram esce:

(

Questo è tutto.Una parentesi aperta.Ho scoperto che se ometto la parte del mio codice che conta le righe e dico manualmente che c'è solo 1 riga, funziona (per 1 riga ovviamente).

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;
}

Ora viene emesso

desrever eb dluohs txet sihT
È stato utile?

Soluzione

In primo luogo, il riavvolgimento stdin non è supportato a meno che (in teoria) sia stato reindirizzato da un file di input.E poiché non c'è modo (conosco, comunque) di sapere che è successo, non preoccuparti di provarlo.

Detto questo, contrario a quanto è evidentemente il parere popolare, non è necessario tamponare l'intero contributo.Puoi ancora buffer la linea-a-a-time:

#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;
}
.

Abbastanza sicuro che farà ciò che stai cercando (o vicino ad esso, comunque)

Altri suggerimenti

Non puoi riavvolgere stdin!

Dovresti rivedere la tua logica in modo da leggere fino a quando EOF invece di provare a contare le linee in anticipo.

Un'altra cosa da guardare è la tua affermazione che conta le righe...

MODIFICARE:Suggerirei anche di impostare stdin uguale a una variabile che è possibile utilizzare per manipolare.Quindi prendi qualcosa del genere temp = stdin quindi avrai sempre quello stdin iniziale e la temperatura che puoi manipolare secondo necessità, e se hai bisogno di tornare indietro, hai ancora stdin.

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

Se ci pensi, la riga che hai inserito non ha un carattere di nuova riga, quindi il tuo programma pensa ancora che ci siano 0 righe.Quindi inizialmente imposterei lineas = 1 o se non sai se ci sarà o meno del contenuto puoi controllare se ci sono dei personaggi al suo interno, quindi dopo un po', o da qualche parte in esso, dì if lineas == 0 then check for characters

Un'altra cosa da considerare è qualcosa chiamato Numeri magici.Questo è ciò che è il tuo 2048.Vorrei cercare di risolvere questo problema, rendendo il 2048 una variabile "globale".

Flusso suggerito

Usa il tuo while dichiarazione invece della tua for dichiarazione.Ma fallo, while(a != EOF) dove a è a char quindi continua a farlo fgetc.Quindi inseriscilo in un array di caratteri di dimensione 2048 ALLA FINE dell'array e lavora all'indietro (oppure potresti inserirlo nell'array di caratteri da 0 a un numero qualsiasi di caratteri, quindi avere un ciclo for che va all'indietro... cioè dove un contatore sarebbe utile).Ma vuoi avere un if a=='\n' quindi stampa la riga al contrario e reimposta l'indice dell'array su 2048.Suggerirei anche di avere un contatore che contenga il numero di caratteri in modo che quando si va indietro nell'array non si debba passare attraverso l'intero fino a quando 2048-counter.

Questo dovrebbe aiutarti con un flusso più conciso.Inoltre, non avrai bisogno di tanto codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top