Jump to content

Simular Linha Comandos


Fernando Couto
Go to solution Solved by Fernando Couto,

Recommended Posts

Fernando Couto

Olá,

Gostava de fazer um pequeno programa que simulasse uma linha de comandos. 

Em baixo tenho o esquema dum menu onde só existem 4 comandos possíveis: "ls"  "ls nomedapasta" "find . -type f -mtime -1" e "find nomedapasta -type f -mtime -1"

Estou com dificuldades em fazer com que o utilizador escolha a opção correta, isto é, escrevo "ls pasta1" e o resultado é "comando não encontrado" ao invés de ser "Estamos na pasta: pasta1." O programa em baixo apenas está simplificado. 

#include<stdio.h>
#include<string.h>

  //Duas funções auxiliares: (main em baixo)
char* pastas(int valor){
	    
	if (valor==0)
	     return "pasta1";
	     
    if (valor==1)
         return "pasta2";
         
    return ""; //Existem estas duas pastas, devolve pasta1 se o utilizador escrever "pasta1", devolve pasta2 caso escreva "pasta2"
	}
	

int compara (char *primeiros){
	
	   if (primeiros[0]='l' && primeiros[1]=='s' && primeiros[2]==' ')
	               return 1;
	   if (primeiros[0]=='f' && primeiros [1]=='i' && primeiros[2]=='n' && primeiros[3]=='d' && primeiros[4]==' ')
	               return 0;
	   return -1;
}//esta função verifica se o comando do utilizador começa por ls ou find e é do tipo: "ls nomedapasta" ou "find nomedapasta (...)"


//Função Principal:


void main(){

int num_pastas=2;
char *comando[100];

while (strcmp(comando, "cd ..")!=0){   //se o utilizador escrever "cd .." deve sair do ciclo, isto não está a acontecer....
        
        scanf("%s",&comando);
		
		if(strcmp(comando, "ls") == 0) //aqui o programa está a acertar.
		     {
			 printf("listar todos os ficheiros e diretorias\n");
			 continue;}
            
        if(strcmp(comando, "find . -type f -mtime -1") == 0)   //aqui o programa está a errar.
            {
			printf("listar todos os ficheiros atualizados na última atualização\n");
			continue; } 
        
        if(compara(comando)==1)  //se o utilizador escrever "ls nomedapasta", aqui se utilizador escrever este comando, não entra aqui mas entra no
             { int aviso=0,i;    // primeiro if do ciclo while
               
			   for(i=0;i<num_pastas;i++)
			       {
				   char *nome=strcat("ls ", pastas(i));
			       if(strcmp(comando,nome)==0)  //verifica se a pasta existe. Neste programa só existem duas pastas: pasta1 e pasta2
			            {
						  printf("Estamos na pasta: %s",pastas(i));
						 aviso=1; }
				   if (aviso==1)break;   
                   }
                if (aviso==1) continue;
			 }
            
        
        if(compara(comando)==0)  //se o utilizador escreveu "find nomedapasta -type f -mtime -1", também não está a entrar aqui.
            { int aviso1=0,g;
               
			   for(g=0;g<num_pastas;g++)
			       {
				   char nome1=strcat("find ", pastas(g));
				   char nome2=strcat(nome1," -type f -mtime -1");
			       if(strcmp(comando,nome2)==0) //verifica se a pasta existe
			            {
						  printf("Estamos na pasta: %s",pastas(g));
						 aviso1=1; }
				   if (aviso1==1)break;   
                   }
                if (aviso1==1) continue;
			 }
			
   
       printf("Comando não encontrado\n");
    }
}

Ora o programa supostamente só deve escrever "Comando não encontrado" quando não se escreveu nenhum dos 4 comandos acima, ele está a escrever sempre, o que não é suposto. Só acerta quando o utilizador escreve "ls". Será que me poderiam ajudar?

Edited by Fernando Couto
Link to post
Share on other sites
PsySc0rpi0n

Não estarás a complicar a coisa?

Existe um método próprio para isso que é o getopt(). Devias dar uma olhadela nesta função!

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to post
Share on other sites
  • Solution
Fernando Couto

Olá, obrigado pela sugestão.

Olha acabei por resolver da seguinte maneira e assim já funciona bem certinho:

#include<stdio.h>
#include<string.h>

char *pastas(int valor){
	    
	if (valor==0)
	     return "pasta1";
	     
    if (valor==1)
         return "pasta2";
         
    return "";
	}
	

int compara (char *primeiros){
//	printf("Comando3 -> %s\n",primeiros); 

	   if (primeiros[0]=='l' && primeiros[1]=='s' && primeiros[2]==' ')
	               return 1;
	   if (primeiros[0]=='f' && primeiros [1]=='i' && primeiros[2]=='n' && primeiros[3]=='d' && primeiros[4]==' ')
	               return 0;
	   return -1;


}

void main(){

int num_pastas=2;
char comando[100];


while (strcmp(comando, "cd ..\n")!=0){
        
        //gets(comando);
		fgets(comando, sizeof(comando), stdin);

		if(strcmp(comando, "ls\n") == 0)
		     {
			 printf("listar todos os ficheiros e diretorias\n");
			 continue;}
            
        if(strcmp(comando, "find . -type f -mtime -1\n") == 0)
            {
			printf("listar todos os ficheiros atualizados na última atualização\n");
			continue; } 
        


        if(compara(comando)==1)
             {

				 int aviso=0,i;
               
			   for(i=0;i<num_pastas;i++)
			       {
					char nome[100]="ls ";
					strcat(nome, pastas(i));
					strcat(nome, "\n");

			       if(strcmp(comando,nome)==0)
			            {
						  printf("Conteúdo da: %s\n",pastas(i));
						 aviso=1; }
				   if (aviso==1)break;   
                   }
                if (aviso==1) continue; else {
				printf("Pasta não encontrada.\n");continue;}
			 }
            
        
        if(compara(comando)==0)
            { int aviso1=0,g;
               
			   for(g=0;g<num_pastas;g++)
			       {
					   char nome1[100] = "find ";
				   	   strcat(nome1, pastas(g));

						strcat(nome1, " -type f -mtime -1\n");

			       if(strcmp(comando,nome1)==0)
			            {
						  printf("Última atualização da: %s\n",pastas(g));
						 aviso1=1; }
				   if (aviso1==1)break;   
                   }
                if (aviso1==1) continue; else {
				printf("Pasta não encontrada.\n");continue;}
			 }
			
   
       if(strcmp(comando, "cd ..\n") !=0) printf("Comando não encontrado\n");
    }
}

 

Link to post
Share on other sites

Sei que o tópico já vai tardio, mas recomendo vivamente usar a função strncmp() (de notar o n no meio, não é a strcmp()) para fazer comparações parciais de strings.

Essa função compara() pode funcionar neste caso, mas estás a (tentar) reinventar a roda. Se porventura tiveres um comando com 50 caracteres (caso hipotético), não é prático fazer um if com 50 comparações índice a índice, certo? Para isso o C já fornece a strncmp() que faz isso muito bem ;) 

Cumprimentos.

Knowledge is free!

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.