Jump to content

Duvida em criar Lista de Listas


Dioguex
 Share

Recommended Posts

Boa tarde,

Tenho que criar um lista de listas para armazenar dados introduzidos numa shell. O meu problema neste momento está em criar a lista de listas e guardar as strings nos campos da segunda estrutura.

O codigo que tenho neste momento é:

#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>
#include <readline/history.h>
#include <string.h>
typedef struct comand{
char *newcmd;
char *cmd;
char *param;
char *input;
char *output;
char *error;
struct comand *pnextcomand;
}COMAND;

typedef struct linha{
struct linha *pnextlinha;
COMAND *pcom;
}LINHA;
void parse_line(char *lin);
int main(int argc, const char * argv[])
{
char *line;
while(1)
{
	line = readline("msh$");
	if (line == NULL)
	{
		perror("malloc error!\n");
		exit(1);
	}
	if (!strcmp(line, "exit")) exit(0);
	add_history(line);
	if (argc != 2){
		parse_line(line);
	}
	free(line);
}
}

void parse_line(char *lin)
{
char *arm, *str1, *str2, *tok, *sbtok;
char *svptr1, *svptr2, *svptr3;
char *name, *parm, *infile, *outfile, *errfile;
int i, j, first;
//fprintf(stderr, "String: %s \n", lin);
//Primeiro loop encontrar a linha de comando que termina com ;
for (i = 1, str1 = lin; ; str1 = NULL){
	tok = strtok_r(str1, ";", &svptr1);
	if(tok == NULL){
		break;
	}
	printf("Linha de comando %d ---> %s\n", i, tok);
	//Segundo loop encontrar comando separados por |
	for (str2 = tok; ; str2 = NULL){
		sbtok = strtok_r(str2, "|", &svptr2);
		if (sbtok == NULL){
			break;
		}
		printf("Novo comando ---> %s\n", sbtok);
		//Terceiro loop divide a string por espaços, caracter a caracter
		arm = strtok_r (sbtok, " \t\r\n", &svptr3); //remover caracteres indesejáveis
		first = 1; //o primeiro token é o comando, os restantes são os parameteros do comando
		for (j = 0; arm; j++){
			//identificar se existe stdin
			if(arm[0] == '<'){
				infile = arm[1] ? arm + 1 : strtok_r (NULL, " \t\r\n", &svptr3);
				printf("Ficheiro stdin: %s\n", infile);
			}else if(arm[0] == '>'){ //identificar se existe stdout
				outfile = arm[1] ? arm + 1 : strtok_r (NULL, " \t\r\n", &svptr3);
				printf("Ficheiro stdout: %s\n", outfile);
			}else if(arm[0] == '2' && arm[1] == '>'){ //identificar se existe erro no redirecionamento
				errfile = arm[2] ? arm + 2 : strtok_r (NULL, " \t\r\n", &svptr3);
				printf("Ficheiro stderr: %s\n", errfile);
			}
			//dividir em comando e parameteros
			else{
				if(first){
					first = 0;
					name = arm;
					printf("Comando: %s\n", name);
				}else{
					parm = arm;
					printf("Parametero: %s\n", parm);
				}
			}
			arm = strtok_r(NULL, " \t\r\n", &svptr3); //procura o token seguinte
		}
	}
}
}

O objectivo é introduzir na shell por exemplo: ls -al ; wc -c | ls -ll, a função parse_line vai dividir o comando, primeiro por ; depois por | e depois por espaços, e no final temos todos os comandos e parâmetros separados.

Mas o objectivo era, em vez de guardar em variáveis, guardar numa estrutura. Ou seja, sempre que era encontrado um ; criava mais um nó na estrutura LINHA, quando encontrava um | era criado mais um nó na estrutura comand, e neste caso ls -ll iria ser guardo na estrutura comand variável newcmd, o ls era guardado na estrutura comand na variável cmd e o -ll na variável param, sempre que fosse dividido um comando era criado um novo nó na estrutura comand.

Podem ajudar?

Obrigado

Link to comment
Share on other sites

Desde já muito obrigado pela resposta.

Eu sei bem o que são listas ligadas, alias já li N de documentação sobre isso, o problema são os casos práticos. Infelizmente, por motivos profissionais não me foi possível frequentar a cadeira onde se abordavam listas, e como tal irei repetir a mesma no próximo ano, mas entretanto sou confrontado com listas noutras cadeiras e dai o meu pedido de ajuda, para tentar perceber de uma vez por todas pois não estou a conseguir implementar apenas lendo as documentações.

Como também posso informar, o meu pedido de ajuda aqui no forum é sempre o meu ultimo recurso, quando já tentei de tudo. Não há, no código nenhuma implementação de listas ligadas, mas não quer dizer que não tenha tentado, o que acontece é que, ando à semanas a tentar implementar uma lista de listas, já tentei em funções separadas dentro da função parse_line, mas até agora não consegui.

Leio este forum à tempo suficiente, para saber bem o tipo de arrogância de alguns dos seus utilizadores que, na sua sabedoria de programação que é inquestionável, em vez de ajudarem quem cá vem tirar duvidas, tentam ser "professores" sem saber o é ser realmente um professor.

Não posso falar por todos, mas posso falar por mim. Não tenho qualquer objectivo que me façam os trabalhos que tenho que fazer, porque se fizessem isso eu nem cá aparecia, mas quando coloco aqui algo, espero um ajuda, com exemplos práticos, quer seja no código que coloco, quer seja com um exemplo geral que me permita perceber o que pergunto. Sinceramente, 99,9% das vezes isso não acontece, comigo e com outros utilizadores que colocam as suas duvidas.

Não que já não estivesse à espera porque como disse frequento este forum algum tempo, e sempre esperei aprender mais sobre programação e sempre achei que aqui seria um bom sitio, mas enganei-me completamente.

Se perceber alguma coisa fosse andar a navegar na wikipedia, todos nós sabíamos de tudo, e este forum não fazia sentido existir.

Peço desculpa, mas não podia deixar de dar a minha opinião, não quero de todo iniciar uma discussão.

Mais uma vez obrigado a todos.

Podem fechar o topico.

Cumprimentos.

Link to comment
Share on other sites

Desde já muito obrigado pela resposta.

Eu sei bem o que são listas ligadas, alias já li N de documentação sobre isso, o problema são os casos práticos. Infelizmente, por motivos profissionais não me foi possível frequentar a cadeira onde se abordavam listas, e como tal irei repetir a mesma no próximo ano, mas entretanto sou confrontado com listas noutras cadeiras e dai o meu pedido de ajuda, para tentar perceber de uma vez por todas pois não estou a conseguir implementar apenas lendo as documentações.

Como também posso informar, o meu pedido de ajuda aqui no forum é sempre o meu ultimo recurso, quando já tentei de tudo. Não há, no código nenhuma implementação de listas ligadas, mas não quer dizer que não tenha tentado, o que acontece é que, ando à semanas a tentar implementar uma lista de listas, já tentei em funções separadas dentro da função parse_line, mas até agora não consegui.

tens de perceber que explicar listas ligadas não é algo que se faça em 2 ou 3 parágrafos. isso pode ser visto tanto como no link da wikipédia que apresentei assim como foi necessário dois artigos em edições diferentes da revista programar (42 e 43) para serem apresentadas.

se pretendes ter exemplos em código podes ver nessas edições onde é apresentado o código exemplo em C.

se tens uma dúvida específica, estás à vontade de apresentar-la, agora fazer exposições que requerem escrever uma resposta de metro e meio onde essa mesma informação pode ser vista em tantos outros locais, a resposta continuará a ser links para esses recursos externos

o resto do tópico vou ignorar ...

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
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
 Share

×
×
  • 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.