Fernando Couto Posted April 28, 2021 at 04:36 PM Report Share #622131 Posted April 28, 2021 at 04:36 PM (edited) 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 April 28, 2021 at 04:39 PM by Fernando Couto Link to comment Share on other sites More sharing options...
PsySc0rpi0n Posted April 30, 2021 at 09:34 PM Report Share #622168 Posted April 30, 2021 at 09:34 PM 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 comment Share on other sites More sharing options...
Solution Fernando Couto Posted May 4, 2021 at 06:14 PM Author Solution Report Share #622217 Posted May 4, 2021 at 06:14 PM 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 More sharing options...
thoga31 Posted May 11, 2021 at 05:10 PM Report Share #622288 Posted May 11, 2021 at 05:10 PM 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 More sharing options...
Fernando Couto Posted June 3, 2021 at 03:00 PM Author Report Share #622541 Posted June 3, 2021 at 03:00 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now