2012-11-27 26 views
6
int main(int argc, char **argv) 
{ 
    char input[150]; 
    char change[2] = "cd"; 
    char *directory; 

    while(1) { 
     prompt(); 
     fgets(input, 150, stdin); 

     if(strncmp(change, input, 2) == 0) { 
      directory = strtok(input, " "); 
      directory = strtok(NULL, " "); 

      printf(directory); 
      chdir(directory); 
      perror(directory); 

     } 

     if(feof(stdin) != 0 || input == NULL) { 
      printf("Auf Bald!\n"); 
      exit(3); 
     } 
    } 
} 

quando avvio e digito "cd test" non ottengo "nessun file o directory". Ma c'è la directory "test".chdir() - nessun file o directory

Esegui su Arch Linux.

+0

Controlla la stringa 'directory' in questo modo:' printf ("directory = [% s] \ n", directory); 'nel caso in cui ci sia un linefeed o altri caratteri indesiderati/invisibili nel nome. –

+0

'char change [2] =" cd "' assegna una matrice di dimensione 3 ad una variabile che è di dimensione 2. Usa 'char change [] =" cd "' invece. –

+0

@ WilliamPursell- In realtà, sta usando 'strncmp (... 2)', quindi è legale, anche se la tua è comunque una buona pratica. – rodrigo

risposta

4

Dal man page:

fgets() legge al massimo in un meno di caratteri di dimensioni da torrente e li memorizza nel buffer puntato da s. La lettura si interrompe dopo unEOF o una nuova riga. Se una nuova riga viene letta, viene memorizzata nel buffer.

Il problema è che c'è un carattere di nuova riga '\n' alla fine della stringa che avete ottenuto da fgets(), è necessario rimuoverlo:

fgets(input, 150, stdin); 
input[strlen(input)-1] = '\0'; 

anche:

char change[2] = "cd"; 

Quello dovrebbe essere change[3], è 2 (per "cd") + 1 per il terminatore NULL '\0' che viene automaticamente posizionato per voi.

Quindi dovrebbe funzionare.

EDIT:

Una differente alternativa è quella di modificare il strtok() chiamata tale che:

directory = strtok(NULL, " \n"); 

Questo funziona se l'utente inserisce la stringa tramite il tasto enter o tramite EOF (Ctrl + d su Linux) personaggio ... Non sono sicuro di quanto sia probabile che il secondo sia un utente da fare ... ma non potrebbe ferire!

+2

Shouldn ' È meglio scrivere 'strtok (...," \ n ")', nel caso in cui la stringa termini con un EOF o qualcosa del genere? – rodrigo

+0

@rodrigo - Sì, sarebbe meglio se ci fosse un EOF. Suppongo che stavo dando per scontato che l'utente debba digitare "cd " anziché "cd " ... ma non si sa mai! Modificato la risposta per coprire questo. – Mike

+0

grazie mille. funziona ora :) – csczigiol