Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312

    C carattere \n nella fgets

    Salve a tutti,
    sto studiando un esercizio (che funziona correttamente) che implementa una sorta di shell unix. Sono arrivato alla parte del codice che conta il numero di parametri passati da input, che sono separati dal carattere "|".
    L'input viene passato tramite fgets e viene inserito in un vettore di caratteri che qui chiamerò copied_string.
    Quando mi si apre una fgets per andare avanti nel programma devo premere invio necessariamente...questo inserisce anche il carattere \n nella copied_string?
    Per contare il numero di parametri separati da | trovo questa porzione di codice:
    codice:
    int args =0;
    if  (((temp = strtok(copied_tring,"\n"))==NULL) || (strcmp(temp,"\0")==0))
    return(-1)
    args++
    while(((temp = strtok(NULL,"\n"))!=NULL)&&(strcmp(temp,"|")!=0)){
         if(strcmp(temp,"\0")==0) break;
         args++
    Quello che non capisco(per esempio nella prima if) se i parametri li metto da tastiera uno \n ci sarà sempre anche se non scrivo nulla perchè invio per andare avanti lo devo premere o no?
    Nel while perchè la strtok non vine fatta sul carattere | anzichè \n che a mio avviso, se è il tasto invio (newline) non ce ne può essere più di uno?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Scusa ... temo di non aver capito qual è la domanda ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312
    Allora, copied_string contiene l'imput da tastiera preso tramite la fgets.
    L'input ha una forma del genere: xxx|yyy|zzz. La funzione deve contare il numero di argomenti separati da "|", in questo caso tre.
    Perchè usa, e funziona, la strtok passandogli come delimitatore "\n". Che io sappia di caratteri newline che possono esserci in copied_string è sempre e solo uno in quanto, una volta che scrivo il comando da tastiera premo invio per mandare la stringa tramite la fgets.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da lio.b
    Allora, copied_string contiene l'imput da tastiera preso tramite la fgets.
    L'input ha una forma del genere: xxx|yyy|zzz. La funzione deve contare il numero di argomenti separati da "|", in questo caso tre.
    Perchè usa, e funziona, la strtok passandogli come delimitatore "\n". Che io sappia di caratteri newline che possono esserci in copied_string è sempre e solo uno in quanto, una volta che scrivo il comando da tastiera premo invio per mandare la stringa tramite la fgets.
    Quelle che hai scritto sono tutte affermazioni ...

    copied_string contiente l'input ...

    L'input ha una forma ...

    La funzione deve contare ...

    ....

    E la domanda precisa che poni, qual e' ? Cosa vuoi sapere ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312
    Vorrei sapere come è possibile contare gli argomenti con quel metodo, ossia facendo una strtok che prende come secondo parametro "\n".

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Ma se il carattere che divide le parti e' il

    |

    perche' usare il \n ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312
    Perfetto...è questo che non capisco. Il codice come ti dicevo non l'ho scritto io. Per completezza il metodo è questo:
    codice:
    int count_args(char *start_command, int *pipe_present, char **next_command) {
        char copied_string[COMMAND_LENGTH + 1];
        char *temp, *temp_next;
        int args = 0, i;
    
        strcpy(copied_string, start_command);
        if (((temp = strtok(copied_string, " \n")) == NULL) || (strcmp(temp, "\0") == 0)) return(-1);
        args++;
        while (((temp = strtok(NULL, " \n")) != NULL) && (strcmp(temp, "|") != 0 )) {
    	    if (strcmp(temp, "\0") == 0 ) break;
    	    args++;
        }
        if (temp == NULL) {
    	    *pipe_present = 0;
    	    *next_command = NULL;
        } else {
    	if ((temp = strtok(NULL, " \n")) != NULL) {
    	  *pipe_present = 1;
              for (i=0; ; i++) if (copied_string[i] == '|') break;
    	  *next_command = start_command + i + 2;
    	}
    	else {
    	  *pipe_present = 0;
    	  *next_command = NULL;
    	}
    	
        }
        return(args);
    }

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Non si puo' dare un giudizio su un codice se non si conoscono i valori dei dati possibili in ingresso ...

    Quello che ti posso dire e' che, se la tua stringa e' ottenuta tramite fgets da tastiera, allora puoi eliminare l'ultimo carattere e procedere al conteggio in questo semplice modo

    codice:
    int args=0;
    copied_string[strlen(ss)-1]=0;
    
    char *temp = strtok(copied_string, "|");
    while(temp != NULL)
       temp = strtok(NULL, "|"), args++;
    Vedi se puoi adattarlo alle tue esigenze ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312
    Perchè eliminare l'ultimo carattere e cosa intendi con copied_string[strlen(ss)-1]=0?
    So che chiedo troppo, ma se ti va, e solo per completezza ti mando il link con la spiegazione e quella col codice completo....senza impegno
    http://www.dis.uniroma1.it/pub/quaglia/eserc-pipes.pdf
    http://www.dis.uniroma1.it/pub/quaglia/shellpipe-unix.c
    Del primo file vedere solo la parte unix.
    Ciao e grazie

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da lio.b
    Perchè eliminare l'ultimo carattere e cosa intendi con copied_string[strlen(ss)-1]=0?
    Perche' la fgets aggiunge un carattere

    \n

    alla fine della stringa inserita da tastiera.

    E per eliminare tale carattere, si inserisce un NULL (lo 0) nella posizione strlen-1
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.