Kaio21 Posted October 18, 2011 Report Share Posted October 18, 2011 Uma ajuda pessoal.Eu sei que o código a seguir está errado, pois eu estou armazenando uma string em um ponteiro. Mas qual seria a alternativa para consertar este código?int main(){ int cont; char* vet[4]; for (cont=0; cont < 4; cont++){ printf(“\n Digite uma nova string: \n”); gets(vet[cont]); }}Obrigado, Quote Link to comment Share on other sites More sharing options...
0 mJi Posted October 18, 2011 Report Share Posted October 18, 2011 (edited) Olá Kaio21.A pergunta me parece um pouco confusa...> Leitura de uma string em um vetor de ponteiro de stringPrimeiramente, um vetor de ponteiro é, como o nome diz, uma estrutura que armazena vários ponteiros. Ponteiros apontam para endereços na memória.Uma string é uma cadeia de caracteres, logo, deve ser armazenada em um vetor de char.Segue um código...#include <stdio.h> int main(){ int cont; char vet[4]; printf("Digite uma nova string: \n"); fgets(vet, 4, stdin); return(0); } Está é a maneira que eu usaria para armazenar a string. Interpretando: char vet[4] é a declaração de um vetor que suporta 4 caracteres (tecnicamente, suporta apenas 3, pois a função adiciona o caracter nulo '\ 0' automaticamente. O fgets(vet, 3, stdin) pega a string que o usuário digitar, aceitando um máximo de 3 caracteres, e coloca em vet. Caso sua pergunta era sobre a utilização de um ponteiro para adicionar ao vetor a string, acredito que possa ser feito da seguinte forma: #include <stdio.h> int main(){ int cont; char vet[4], *ponteiro = &vet; printf("Digite uma nova string: \n"); fgets(ponteiro, 4, stdin); return(0); }Interpretando...São declarados o vetor de char e o ponteiro, que é inicializado logo na declaração com o endereço do vetor anteriormente declarado. Isto evita a necessidade de utilizar a função malloc para alocar dinamicamente espaço em memória durante o tempo de execução, mas isto é assunto pra outro momento.No momento do fgets, é utilizado o ponteiro ao invés do vetor, o que significa que o local na memória em que o ponteiro está apontando irá receber os caracteres digitados.Espero ter ajudado. Edited October 18, 2011 by mJi Quote Link to comment Share on other sites More sharing options...
0 Kaio21 Posted October 18, 2011 Author Report Share Posted October 18, 2011 (edited) Olá mJi,Obrigado pela resposta.Na verdade o que eu queria era criar um vetor de ponteiros e esses ponteiros apontariam para uma string, cada um. Seria uma alternativa para uma matriz de caracteres, onde cada linha da matriz é uma string. O problema é na hora de ler uma string do teclado (utilizando o vetor de ponteiros). Edited October 18, 2011 by Kaio21 Quote Link to comment Share on other sites More sharing options...
0 bruce845 Posted October 18, 2011 Report Share Posted October 18, 2011 (edited) Bem, como você têm o número definido (acho que é 4, no caso), é mehor criar uma matriz (bidimensional) para armazenar as strings!Dicas: Use a diretiva define ao seu favor!Use a função fgets ao invés de gets() para não invadir memória caso exceda o limite da string!Tópico sobre a fgets(): http://scriptbrasil.com.br/forum/index.php?showtopic=164402Defini a quantidade de nomes no define!#include <stdio.h> #include <conio.h> #define TAMANHO_NOME 30 #define QTDE_NOMES 4 int main(void) { int cont; char vet[QTDE_NOMES][TAMANHO_NOME]; for (cont=0; cont < QTDE_NOMES; cont++) { printf(“Digite uma nova string: \n”); fgets(vet[cont]); system("CLS"); // Apaga a tela. } return 0; } Edited October 18, 2011 by bruce845 Quote Link to comment Share on other sites More sharing options...
0 mJi Posted October 19, 2011 Report Share Posted October 19, 2011 (edited) Olá mJi,Obrigado pela resposta.Na verdade o que eu queria era criar um vetor de ponteiros e esses ponteiros apontariam para uma string, cada um. Seria uma alternativa para uma matriz de caracteres, onde cada linha da matriz é uma string. O problema é na hora de ler uma string do teclado (utilizando o vetor de ponteiros).Ah, agora entendi com clareza.A declaração de um vetor de ponteiros pode ser feita da seguinte forma:char *vetor[4]; Este é um vetor que contém 4 ponteiros. Até o momento, estes ponteiros podem estar apontando para um lugar qualquer da memória, portanto, ao utilizar alguns dos ponteiros, inicialmente é necessário alocar memória para os mesmos. Isto é feito com a função 'malloc' (disponível na biblioteca 'stdlib.h'). Um exemplo. Você deseja fazer o ponteiro vetor[1] apontar para uma string qualquer. Consideremos o tamanho máximo da string sendo 29 caracteres mais o caractere nulo '\ 0'. #include <stdio.h> #include <stdlib.h> #define MAXCARACTERES 30 int main(){ char *vetor[4]; vetor[1] = malloc(MAXCARACTERES*sizeof(char)); fgets(vetor[1], MAXCARACTERES-1, stdin); free(vetor[1]); return(0); }Interpretando...É feita a declaração do vetor de ponteiros, contendo 4 ponteiros.Antes de se utilizar um dos ponteiros, é necessário fazer a 'reserva' de memória. Não queremos colocar uma string num local desconhecido da memória, isto pode causar problemas dos mais simples aos mais sérios. Para isto, utiliza-se a função 'malloc' (Há outras funções de alocação dinâmica, mas fiquemos com esta por hora).Esta função recebe como parâmetro o número de bytes a ser reservado, portanto, é multiplicado o máximo de caracteres da string pelo tamanho de bytes que um caractere ocupa (nunca coloque este valor diretamente, sempre tilize o sizeof, pois o tamanho deste valor varia em alguns sistemas).A 'malloc' irá retornar um ponteiro void, que pode ser atribuido á qualquer ponteiro, e neste caso, atribuimos á vetor[1].Agora, vetor[1] aponta para um endereço na memória que possui MAXCARACTERES*sizeof(char) livres á sua frente, prontos para receber a string.Utilizo o fgets para evitar o overflow; o endereço da string será o apontado por vetor[1], a quantidade de caracteres máximas será MAXCARACTERES-1 (deixa-se espaço para o '\ 0', que o fgets coloca automaticamente), e o stream-fonte será stdin (o teclado).Quando terminamos de utilizar aquele espaço na memória, temos que liberá-lo (não necessáriamente temos que fazer isto, pois o computador limpa a memória ao ser desligado. Porém, isto é uma boa prática, pois recupera espaço na memória que poderá ser usado por outras aplicações). Para liberá-lo, utiliza-se a função 'free' (também disponível em 'stdlib.h').Foi mal o texto grande, espero ter ajudado. Edited October 19, 2011 by mJi Quote Link to comment Share on other sites More sharing options...
Question
Kaio21
Uma ajuda pessoal.
Eu sei que o código a seguir está errado, pois eu estou armazenando uma string em um ponteiro. Mas qual seria a alternativa para consertar este código?
int main(){
int cont;
char* vet[4];
for (cont=0; cont < 4; cont++){
printf(“\n Digite uma nova string: \n”);
gets(vet[cont]);
}
}
Obrigado,
Link to comment
Share on other sites
4 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.