Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C] lettura comandi

    ciao a tutti
    sto scrivendo un piccolo programma in C che iterativamente resta in attesa di un comando da stdin. I comandi sono codificati come stringhe tipo "start" "delete" ecc, e se riconosciuti eseguono determinate operazioni. Quello che non so come realizzare è il riconoscimento di alcuni comandi tipo "comando [opzione]" dove la parte tra [] è opzionale, e in caso ci sia va memorizzata.
    Per il riconoscimento dei comandi ho semplicemente messo una serie di if/else if che confrontano la stringa letta. Come posso fare?
    grazie!

  2. #2
    Ciao,
    quello che puoi fare e' riconoscere gli spazi all'interno dell'array di caratteri (immagino che la tua stringa sia un array di caratteri, visto che lavori in C) e separare la tua stringa di input in termini di questi: quindi 'leggi' la stringa di input fino a trovare o meno uno spazio. Tutti i caratteri prima dello spazio sono il <comando> mentre tutto quello che viene dopo (se esiste) sono le opzioni.

    Mettiamo che hai separato una stringa di comandi e opzioni. A questo punto usi i tuoi if/else statements per riconoscere se il comando e' uno valido, dopodiche', se un comando ha anche opzioni, cerchi di riconoscere se le opzioni inserite dallo user sono valide.

    In C++ potresti usare la classe String e potresti separare il comando e le opzioni utilizzando ricorsivamente String::find() per trovare le posizioni di spazi, se esistono, e substr, per 'tagliare' la stringa a quelle posizioni.

    Spero di essere stato d'aiuto!

    EDIT:

    P.S. Vedi (sono in inglese pero'):
    http://www.cplusplus.com/reference/s...string/substr/
    http://www.cplusplus.com/reference/string/string/find/

  3. #3
    ti ringrazio molto

    ho provato intanto a riconoscere comandi semplici ma ho già prime difficoltà:

    codice:
    int main ()
    {
    	char* cmd;
    
    	while(1) {
    
    		scanf("%s", &cmd);
    		
    		if (!(strcmp(&cmd, "start"))) {
    			start();
    		}
    		else if (!(strcmp(&cmd, "stop"))) {
    			return 0;
    		}	
    		else {
    			printf("Comando non riconosciuto\n");
    		}
    	}
    	
    	return 0;
    }
    a parte che ricevo questi warning dal compilatore gcc (su ubuntu):

    alla linea di scanf:
    codice:
    "format '%s' expects type 'char *', but argument 2 has type 'char **' "
    alle linee dove uso strcmp
    codice:
    "passing argument 1 of 'strcmp' from incompatible pointer type"
    ma oltre a questo, ottengo un segmentation fault alla chiusura del programma se digito comandi di lunghezza maggiore a 3 caratteri.
    tuttò ciò è sicuramente dovuto alla mia ignoranza in materia di scanf e puntatori, quindi sapreste correggermi o darmi un indizio?
    vi ringrazio ancora

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Correggilo così:
    codice:
    int main ()
    {
    	char *cmd;
            cmd=(char*)malloc(100*sizeof(char));
    	while(1) {
    
    		scanf("%s", cmd);
    		
    		if (!(strcmp(cmd, "start"))) {
    			start();
    		}
    		else if (!(strcmp(cmd, "stop"))) {
    			return 0;
    		}	
    		else {
    			printf("Comando non riconosciuto\n");
    		}
    	}
    	
    	return 0;
    }

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Per quanto riguarda le opzioni dei comandi, ti consiglio di usare uno stack di stringhe.
    Ogni volta che leggi una porzione di stringa racchiusa tra parentesi pushi nello stack quella stringa.
    Ad esempio se hai il comando:
    codice:
    do [opzione1] [opzione2]
    Leggi tutta la stringa, innanzitutto controlli che ogni simbolo '[' sia seguito da un simbolo ']', ma quello lo fai a parte.Dopo il controllo dividi la stringa in 3 parti:
    codice:
    "do"
    "[opzione1]"
    "[opzione2]"
    L' hai divisa in token.
    Una volta divisa hai le varie parti inserite nello stack, ti basterà leggerlo.
    Stai scrivendo il programma di un interprete comandi, in particolare la parte che divide la stringa in token è l' analizzatore lessicale.

  6. #6
    edit

  7. #7
    grazie
    e come dovrei implementare questo stack? come un array di char* ?
    che funzioni posso usare per le operazioni che mi hai consigliato? ci sono funzioni per stringhe nella libreria standard oppure devo fare tutto a mano?

  8. #8
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    edit

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Puoi fare una lista linkata contenente array di char,ma se non ti va di implementare la lista potresti anche tenere tutto sullo stesso array di char.
    In string.h c'è la funzione strtok per suddividere una stringa in token.Basta specificare il delimitatore, ti faccio un esempio:
    codice:
    char *str;
    char *tokens;
    // allochi spazio per le stringa e prendi str in input
    tokens=strtok(str," []");
    In pratica ti divide la stringa ogni volta che incontra uno spazio, o un carattere '[' , o ']'.Quei caratteri verranno poi eliminati dalla stringa, per cui ora hai direttamente i comandi su cui lavorarci sopra.

  10. #10
    grazie ancora, funziona alla grande
    manca solo il controllo del matching delle [ ]
    devo farlo "a mano" analizzando carattere per carattere oppure c'è qualche funzione di libreria? io nn ne ho trovate

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 © 2024 vBulletin Solutions, Inc. All rights reserved.