Pagina 1 di 1

Problema con assegnazione del terminatore in un buffer

MessaggioInviato: 14 nov 2011, 18:14
da alien75
Salve, sto' facendo una prova con il seguente pezzo di codice:

Codice: Seleziona tutto
while(1)
    {
        x=0;
/*inserimento buffer del comando*/
        printf("\n\n\n>");
        while((ch=getchar())!='\n' && x<MAX) {buffer[x++]=ch;}
        buffer[x]='\0';
        //strncat((buffer+x),'\0',2);
/*copia buffer[] in buffer1[] per poi testare buffer1[] in modo da non alterare il contenuto di buffer[]*/
        strcpy(buffer1,buffer);


Esso serve ad inserire un comando seguito da una voce contenuti dentro a 'buffer'.
Dopo aver inserito comando e voce ad esempio il comando 'cancella rrrr' che serve a cancellare la voce 'rrrr' mi succede che il terminatore mi viene messo alla fine di tale stringa contenuta in 'buffer'. L' inserimento di buffer[x]='\0' serve per dividere il 'comando' dalla voce tramite un '\0'.
Nella seconda iterazione di while() inserisco un comando piu' corto di nome 'help': come previsto dal codice help viente sovrascritto in 'buffer' inserendo un \000 dopo buffer dandomi come risultato 'help\00a rrrr' .
Mi succede che la copiatura di buffer in buffer1 funziona fermandosi appunto dopo \000 pero' il resto di buffer viente copiato in un altro array compreso \000 cosa che io non voglio perche'
devo copiare in un array il contenuto di 'buffe' che inizia dal terminatore fino alla fine della voce 'rrrr'
Nessuno mi puo' dare una mano a far si che dopo l' inserimento del teminatore non sia piu' possibile leggere e scrivere oltre help?
Non so' come risolvere. #-o #-o

Re: Problema con assegnazione del terminatore in un buffer

MessaggioInviato: 14 nov 2011, 23:16
da Candy
Il tuo problema potrebbe essere di semplice soluzione, ma, sarà forse l'ora, io non ho capito quale sia il problema.
Però, in primo luogo, i buffer di dati RAW sarebbe meglio copiarli con la funzione memcpy(). la funzione strcpy() è predisposta per delle stringhe ASCII e si interrompe al primo carattere '\0' che trova. La parte di buffer eccedente la copia non viene inizializzata. Ossia, resta sporco.

Re: Problema con assegnazione del terminatore in un buffer

MessaggioInviato: 15 nov 2011, 18:21
da alien75
Allora ho modificato cosi:

Codice: Seleziona tutto
while(1)
    {
        x=0;
/*inserimento buffer del comando*/
        printf("\n\n\n>");
        while((ch=getchar())!='\n' && x<MAX) {buffer[x++]=ch;}
        //buffer[x]='\0';
        //strncat((buffer+x),'\0',2);
/*copia buffer[] in buffer1[] per poi testare buffer1[] in modo da non alterare il contenuto di buffer[]*/
        //strcpy(buffer1,buffer);
        memcpy(buffer1,buffer,sizeof(buffer));


ma compilando ed eseguendo ed inserendo prima il comando 'cancella rrrr' ottengo in buffer
appunto 'cancella rrrr' se nel comando sucessivo inseerisco 'help' che e' piu' corto di quello precedente riottengo 'helpella rrrr' come prima: mi succede quindi che memcpy() continua a
copiare dentro a buffer1 pure lo "sporco" rimanente che c'era da prima in buffer e quindi
il comando non vienne riconosciuto dalle funzioni sucessive.
A me serve invecie una funzione che copia dentro a buffer1 il contenuto di buffer e che si fermi quandi trova lo '\n' di a capo inserito da tastiera inserito nel comando attuale.
Avresti qualche idea?

Re: Problema con assegnazione del terminatore in un buffer

MessaggioInviato: 15 nov 2011, 19:10
da DirtyDeeds
Io lo farei così (p è un char* e bisognerebbe aggiungere un controllo che la fgets dia un risultato diverso da NULL)

Codice: Seleziona tutto
while(1) {
/*inserimento buffer del comando*/
        printf("\n\n\n>");
        fgets(buffer, sizeof(buffer), stdin);
        if ((p = strchr(buffer, '\n')) != NULL) *p = '\0';
        strcpy(buffer1,buffer);
}

Re: Problema con assegnazione del terminatore in un buffer

MessaggioInviato: 17 nov 2011, 2:31
da casmic
potrei ovviamente non aver capito nulla, ma cosi' ?

Codice: Seleziona tutto
while(1)
    {
      //++AGGIUNTO
      memset(buffer, 0, sizeof(buffer));
      memset(buffer1, 0, sizeof(buffer1));
      //--AGGIUNTO
      x=0;
/*inserimento buffer del comando*/
.
.
.

Re: Problema con assegnazione del terminatore in un buffer

MessaggioInviato: 17 nov 2011, 14:12
da alien75
DirtyDeeds ha scritto:Io lo farei così (p è un char* e bisognerebbe aggiungere un controllo che la fgets dia un risultato diverso da NULL)

Codice: Seleziona tutto
while(1) {
/*inserimento buffer del comando*/
        printf("\n\n\n>");
        fgets(buffer, sizeof(buffer), stdin);
        if ((p = strchr(buffer, '\n')) != NULL) *p = '\0';
        strcpy(buffer1,buffer);
}



Ho applicato la tua soluzione e funziona grazie mille! :ok: