Normalmente esse processo é meio chato, dá bugs estranhos e é meio
obscuro então vai uma dica para quem quer e/ou precisa tratar com esse
tipo de vetor.
Vamos tratar com vetor de “char” dinâmico com 2 dimensões (o mesmo de
um vetor de strings de 1 dimensão):
Imagine a situação em que temos uma linha com N palavras e queremos
colocar cada uma em uma posição do vetor para isso eu vou usar algumas
funções: “strtok”, “strcpy” e “getline” (explicação de como funciona
fica pra próxima).
Lembrando que “line” é um char * para uma linha com N palavras.(nesse
exemplo usei um teste.txt com 9 palavras)
int main() {
FILE *fentrada;
char **vetor = NULL;
char *line = NULL;
char *token;
size_t len = 1;
int N = 9;
int i;
fentrada = fopen(“teste.txt”, “r”);
getline(&line, &len, fentrada);
token = strtok(line, ” “);
vetor = (char **) realloc(vetor, N * sizeof(char **));
vetor[0] = (char *) malloc(sizeof(char) * (strlen(token) + 1));
strcpy(vetor[0], token);
for (i = 1; i < N; i++) {
token = strtok(NULL, ” “);
vetor[i] = (char *) malloc(sizeof(char) * (strlen(token) + 1));
strcpy(vetor[i], token);
}
return 0;
}
Esse processo é pra quando você sabe o valor de N, caso não saiba fica assim:
int main() {
FILE *fentrada;
char **vetor = NULL;
char *line = NULL;
char *token;
size_t len = 1;
int N = 9;
int i;
fentrada = fopen(“teste.txt”, “r”);
getline(&line, &len, fentrada);
token = strtok(line, ” “);
vetor = (char **) realloc(vetor, 1 * sizeof(char **));
vetor[0] = (char *) malloc(sizeof(char) * (strlen(token) + 1));
strcpy(vetor[0], token);
i = 1;
do {
token = strtok(NULL, ” “);
if (token) {
vetor = (char **) realloc(vetor, (i + 1) * sizeof(char **));
vetor[i] = (char *) malloc(sizeof(char) * (strlen(token) + 1));
strcpy(vetor[i], token);
i++;
N = i;
}
} while (token);
return 0;
}
A idéia é que a primeira dimensão seja dinâmica e vá variando conforme
o numero de palavras e a segunda dimensão tenha o tamanho exato da
palavra(pra não desperdiçar memória ou não estourar a memória se
faltar).
Ambas as implementações é possível acessar a posição da palavra, pra
por exemplo imprimir:
for (i = 0; i < N; i++) {
printf(“%s\n”, vetor[i]) ;
}
Bom esse é um artigo para preparação para Vetor 3D logo mais postarei outro artigo explicando sobre Vetor 3D
Comentários