• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nazgulled

Pequeno problema com array de strings

5 mensagens neste tópico

Tenho o seguinte código:

typedef struct sHistorial {
char *nome[25];
} Historial;

Historial actualizaHistorial(Historial historial, char *comando) {
int i, tamanho = sizeof(historial)/4;

for(i=0; i < tamanho; i++) {
	if(historial.nome[i] == NULL) {
		printf("%s\n", comando);
		strcpy(historial.nome[i], comando); // ISTO DA SEGMENTATION FAULT!
		i =  tamanho; // O prof nao gosto de breaks.
	}
}

return historial;
}

Historial inicializaHistorial(Historial historial) {
int i, tamanho = sizeof(historial)/4;

for(i=0; i < tamanho; i++) {
	historial.nome[i] = NULL;
}

return historial;
}

void inicializaAmbiente() {
char comando[256];

Historial historial;

historial = inicializaHistorial(historial);

while(1) {		
	printf("\nComando> ");
	lerString(comando, sizeof(comando));

	historial = actualizaHistorial(historial, comando);
}
}

Vejam o comentário no código e expliquem porquê e como resolver, não consigo perceber... Inicialmente tentei historial.nome = comando mas isto só me actualiza o apontador porque por mais comandos que eu fosse lendo e inserindo no historial, quando actualizasse o historial, todos os comandos lá iriam ficar com o mesmo valor.

Estou a desesperar... E quase que aposto que vai ser uma coisinha de nada... :S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Faz historial.nome[ i] = strdup(comando);

O problema com o strcpy é que não tens espaço alocado para a string.

Se tivesse char nome[25][256]; também já devia dar com o strcpy, mas o strdup é melhor pois só aloca o espaço necessário.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas o strdup é standard? Tenho aqui um PDF com as funções standard do C e essa não consta na lista... :S

Ou seja, se eu fizer malloc e depois usar o strcpy vai dar ao mesmo né? Com essa excepção que falaste do espaço alocado, mas isso posso calcular os bytes usando o strlen().

O meu único prob é se a função é standard, se n for, n sei se o prof vai gostar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hum... Tenho de arranjar um PDF mais actualizado então...

Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora