Jump to content

Simular Linha Comandos


Fernando Couto
Go to solution Solved by Fernando Couto,

Recommended Posts

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 comment
Share on other sites

  • Solution

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 comment
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 comment
Share on other sites

  • 4 weeks later...
Em 11/05/2021 às 18:10, thoga31 disse:

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.

Obrigadíssimo!!!!

Link to comment
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.