Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problema con assegnazione del terminatore in un buffer

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[1] Problema con assegnazione del terminatore in un buffer

Messaggioda Foto Utentealien75 » 14 nov 2011, 18:14

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
Avatar utente
Foto Utentealien75
1 1 4 7
Sostenitore
Sostenitore
 
Messaggi: 597
Iscritto il: 31 lug 2011, 14:08

2
voti

[2] Re: Problema con assegnazione del terminatore in un buffer

Messaggioda Foto UtenteCandy » 14 nov 2011, 23:16

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.
Avatar utente
Foto UtenteCandy
32,5k 7 10 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 10123
Iscritto il: 14 giu 2010, 22:54

0
voti

[3] Re: Problema con assegnazione del terminatore in un buffer

Messaggioda Foto Utentealien75 » 15 nov 2011, 18:21

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?
Avatar utente
Foto Utentealien75
1 1 4 7
Sostenitore
Sostenitore
 
Messaggi: 597
Iscritto il: 31 lug 2011, 14:08

0
voti

[4] Re: Problema con assegnazione del terminatore in un buffer

Messaggioda Foto UtenteDirtyDeeds » 15 nov 2011, 19:10

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);
}
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[5] Re: Problema con assegnazione del terminatore in un buffer

Messaggioda Foto Utentecasmic » 17 nov 2011, 2:31

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*/
.
.
.
Avatar utente
Foto Utentecasmic
0 2
 
Messaggi: 26
Iscritto il: 12 nov 2011, 22:19
Località: Ranzo

0
voti

[6] Re: Problema con assegnazione del terminatore in un buffer

Messaggioda Foto Utentealien75 » 17 nov 2011, 14:12

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:
Avatar utente
Foto Utentealien75
1 1 4 7
Sostenitore
Sostenitore
 
Messaggi: 597
Iscritto il: 31 lug 2011, 14:08


Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 45 ospiti