Problema con getchar

di il
9 risposte

Problema con getchar

Salve a tutti ,

Ecco la mia funzione con getchar

int DistinguiComando(Puntatore c) {            // Puntatore è tipo char*
     Puntatore lettera = new char;
     int pos = 0;
     while ( (*lettera = getchar() ) != EOF ) {   // <---- qui mi da errore dicendomi che non posso confrontare puntatore con intero
               if ( *lettera == " " )
                     break;
               c[pos++] = *lettera;
     }
     if ( pos == 0 ) 
          return 0;
     return 1;
}

Mi potreste aiutare? mi da errore dove ho indicato, ho una funzione simile e me lo da sempre lì ma non capisco perchè

9 Risposte

  • Re: Problema con getchar

    Attento, la getchar() restituisce un intero e non un char.
    Ciao.
  • Re: Problema con getchar

    Post-eresti la definizione di puntatore per capire meglio? Mi è venuto un dubbio.
    La mia precedente osservazione, benché formalmente corretta è in realtà compensata in automatico dal compilatore nel caso di caratteri da tastiera. è comunque pericoloso abusarne perchè può dare origine a sporcamenti di memoria. Fammi sapere. Ciao.
  • Re: Problema con getchar

    void DistinguiParametri(int * dimensione, Array par) {
         *dimensione = 0;
         Stringa appoggio;
         int nextChar = 0 ;
         Puntatore lettera = new char;
         while ( (*lettera = getchar() ) != '\n' ) {
               if ( *lettera == ' ') {
                  appoggio[nextChar] = '\0';
                  nextChar = 0;
                  strcpy(par[*dimensione],appoggio);   //<-- Invalid conversion from 'char' to 'char*'
                  *dimensione++;
               }
               else {
                  appoggio[nextChar] = *lettera;
                  nextChar++;
               }
         }   
         *dimensione++;
    }
    
    ora mi da solo questo errore ma non capisco il motivo , appoggio è tipo stringa e l' ho creeato così
    
    typedef char Stringa[100];
    
    array invece
    
    typedef Stringa Array [100];
    
  • Re: Problema con getchar

    Innazitutto vedo che usi la variabile passata, anche se correttamente deferenziata un po troppe volte. Non è una usanza "salubre". usa una variabile locale e alla fine aggiorna il parametro.
    Poi devi stare attento all'ordine di precedenza degli operatori. Purtroppo il ++ ha precedenza sull'operatore di deferenziazione *. così con *a++ ottieni prima l'incremento di a, che è un puntatore e quindi diventa indefinito o peggio ancora vagante.
    Prima correggiamo questo e poi vediamo il resto.
  • Re: Problema con getchar

    Potresti dirmi se si tratta di un errore run time o di compilazione?
  • Re: Problema con getchar

    Grazie per l' aiuto innazitutto

    Allora il problema delle stringhe l' ho risolto, era come dicevi te, ora sono riuscito a farlo anche tramite solo puntatori ( al prof piace di più xD ) però ora non riesco a fare una cosa, però a questo punto dovrò spiegare tutto il programma xD:

    Io dovrei simulare la shell di linux, il suo terminale, quindi devo ricevere in ingresso una stringa e eseguirla come comando ( esempio: ps -aux ). Devo utilizzare la fork e l' exec. Quindi io dovrò fare un Ciclo infinito ( simula la shell ) in cui richiedo in ingresso sempre una stringa, da lì distinguere il comando e i parametri , separati dagli spazi " " , dopodichè devo creare un figlio ( fork() ) e fargli fare una exec nella quale eseguirà il comando con i parametri inseriti nell' input. Il problema è che non ho capito il comando exec , non so quale tra le funzione exec ( execlp , execl , execv ec... ) devo usare e in che modo, cioè, gli posso passare direttamente il comando o gli devo dare il path? , ho fato il programma e funziona solo che non esegue i programmi xD. Poi un' altra cosa nell' exec, devo passargli i parametri con tipo char* const char* oppre una stringa char* contenente tutti i parametri separati dallo spazio.
    
    #include <string.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <iostream>
    
    typedef char Stringa[100];
    
    int DistinguiComando(char*);
    void DistinguiParametri(int*,char**);
    void Path(char* path,char* comando,char *);
    
    int DistinguiComando( char * comando){
        char lettera;
        int pos = 0;
        int continuo = 0;
        while ( (lettera = getchar() ) != '\n' ) {
              continuo = 1;
              if (lettera == ' ')
                          break;
              else
                   comando[pos++] = lettera;
        }
        if ( continuo == 1 && lettera == '\n' ){
           comando[pos] = '\0';
           return 2;
        }
        if (continuo == 1) {
           comando[pos] = '\0';
           return 1;
        }
        else
             return 0;
    }
    
    void DistinguiParametri ( int *dimensione, char ** par ) {
         char lettera;
         *dimensione = 0;
         int nextChar = 0;
         par[(*dimensione)] = new char[15];
         while ( (lettera=getchar() ) != '\n') {
               if (lettera == ' '){
                  par[*dimensione][nextChar] = '\0';
                  nextChar = 0;
                  (*dimensione)++;
                  par[(*dimensione)] = new char[15];
               }
               else {
                    par[(*dimensione)][nextChar] = lettera;
                    nextChar++;
               }
         }
         (*dimensione)++;
    }
    
    /*void DistinguiParametri(int *dimensione, char* par) {
         char lettera;
         int pos = 0;
         while ( (lettera = getchar()) != '\n' ) {
               par[pos++] = lettera;
         }
    }*/
    
    void Path(char* path,char* comando,char* percorso) {
         int pos=0;
         int i = 0 ;
         while ( percorso[i] != '\0' )
    	path[pos++] = percorso[i++];
         i= 0;
         while ( comando[i] != '\0' )
               path[pos++] = comando[i++];
         path[pos] = '\0';
               
         
    }
    
    
    int main()
    {
        int pid;
        while (1) {
            char *comando = new char[15];
            char ** parametri = new char*[10];
            char *path = new char[100];
    	char *percorso = new char[100];
            int *dimensione = new int;
            int verifica = DistinguiComando(comando);
            if ( verifica == 1) {
                 DistinguiParametri(dimensione,parametri);
                 pid = fork();
                 if (pid == -1)
                    std::cout <<" Creazione figlio fallita "<<std::endl;
                 else if ( pid == 0) {
    		  strcpy(percorso,"/bin/");
                 	  Path(path,comando,percorso);
                      if ( execv(path,parametri) == -1 ){
    		  	strcpy(percorso,"/bin/sh/");
    			Path(path,comando,percorso);
    			if ( execv(path,parametri) == -1 ) 
    				execv(comando,parametri);
    		  }
                      _exit(0);
                 }
                 else
                      wait(NULL);
            }
            else if ( verifica == 2 ) {
                 pid = fork();
                 if (pid == -1)
                    std::cout <<" Creazione figlio fallita "<<std::endl;
                 else if ( pid == 0) {
    		  strcpy(percorso,"/bin/");
                 	  Path(path,comando,percorso);
                      if ( execv(path,parametri) == -1 ){
    		  	strcpy(percorso,"/bin/sh/");
    			Path(path,comando,percorso);
    			if ( execv(path,parametri) == -1 ) 
    				execv(comando,parametri);
    		  }
                      _exit(0);
                 }
                 else
                      wait(NULL);
            }
        }
         
        return 0;
    }
    
  • Re: Problema con getchar

    Allora questo programma mi funziona se digito questi comandi:
    ps -aux
    ss

    Però se scrivo help non mi funziona niente perchè?
  • Re: Problema con getchar

    Ok ho verificato che è un problema di path, non tutti i comandi si trovano nello stesso path, ma come faccio a sapere esempio , il comando help in quale cartella si trova?
  • Re: Problema con getchar

    Più che altro devi sistemare il PATH dell'utente dal quale lanci il programmino.
    Ovvero, in Linux ogni utente ha il suo PATH che contiene tutte i path degli eseguibili di interesse per quell'utente. Quindi se l'utente che esegue il programma non ha help nel suo PATH bisogna dare il path completo per poterlo eseguire. Di default l'utente generico non ha nemmeno la sua home nel PATH (Forse avrai notato che per eseguire l'eseguibile del tuo programma hai dovuto forse digitare ./nomeeseguibile).
    Il PATH lo puoi modificare nel file .bashrc.
    Comunque per trovare un file, e quindi il suo path, puoi usare il comando find:
    find / -name foo
    puoi ridirezionare gli errori con
    find / -name foo 2>/dev/null
    Così gli errori non ti disturberanno a schermo. Saluti.
Devi accedere o registrarti per scrivere nel forum
9 risposte