Domanda

Come a filo il stdin ??

Perché non funziona nel seguente frammento di codice?

#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include <fcntl.h>

int main()
{
        int i=0,j=0, sat;
        char arg[256];
        char * argq;
        argq = malloc(sizeof(char)*10);

        printf("Input the line\n");
        i=read(0, arg, sizeof(char)*9);
        arg[i-1]='\0';
        fflush(stdin);

        i=read(0, argq, sizeof(char)*5);
        argq[i-1]='\0';

        puts(arg);
        puts(argq);

        return 0;
}

Ora, se io do l'ingresso come 11 caratteri, solo il 9 dovrebbe essere letto, ma i rimanenti due caratteri nella stdin non sono arrossato e leggere di nuovo in argq. Perché?

Input: 123 456 789

Output: 123 456 89

Perché mi appare questo 89 come uscita?

È stato utile?

Soluzione

Credo fflush viene utilizzato solo con flussi in uscita.

Si potrebbe provare a fpurge o __ fpurge su Linux. Si noti che fpurge non è standard e non portatile. Potrebbe non essere a disposizione di voi.

Da un Linux fpurge pagina man : Di solito si tratta di un errore di voler scartare buffer di ingresso.

La soluzione più portatile per il lavaggio stdin probabilmente sarebbe qualcosa sulla falsariga di quanto segue:

int c;
while ((c = getchar()) != '\n' && c != EOF);

Altri suggerimenti

int c;
while((c = getchar()) != '\n' && c != EOF);

E 'come mi piacerebbe cancellare il buffer di ingresso.

  

Come lavare l'stdin ??

flussi di input Flushing è invocando un comportamento indefinito. Non provare.

Si può solo filo flussi in uscita.

Si sta ignorando l'ultimo elemento dell'ingresso in arg con '\0'. Quella linea dovrebbe essere arg[i]='\0'; invece (dopo l'errore e il controllo di confine si sta perdendo.)

Altri ha già commentato la parte di lavaggio.

Non è possibile stdin pulita in Linux senza urtare gli scenari che il comando si avvia in attesa di input in alcuni casi. Il modo per risolverlo è quello di sostituire tutti std :: cin con readLineToStdString ():

void readLine(char* input , int nMaxLenIncludingTerminatingNull )
{
    fgets(input, nMaxLenIncludingTerminatingNull , stdin);

    int nLen = strlen(input);

    if ( input[nLen-1] == '\n' )
        input[nLen-1] = '\0';
}

std::string readLineToStdString(int nMaxLenIncludingTerminatingNull)
{
    if ( nMaxLenIncludingTerminatingNull <= 0 )
        return "";

    char* input = new char[nMaxLenIncludingTerminatingNull];
    readLine(input , nMaxLenIncludingTerminatingNull );

    string sResult = input;

    delete[] input;
    input = NULL;

    return sResult;
}

Ciò consentirà anche di inserire spazi in std :: cin stringa.

In Windows è possibile utilizzare rewind (stdin) fuction.

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