Ir para conteúdo
Fórum Script Brasil
  • 0

Leitura de uma string em um vetor de ponteiro de string


Kaio21

Pergunta

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 para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Olá Kaio21.

A pergunta me parece um pouco confusa...

> Leitura de uma string em um vetor de ponteiro de string

Primeiramente, 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.

Editado por mJi
Link para o comentário
Compartilhar em outros sites

  • 0

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).

Editado por Kaio21
Link para o comentário
Compartilhar em outros sites

  • 0

Bem, como você têm o número definido (acho que é 4, no caso), é mehor criar uma matriz (bidimensional) para armazenar as strings!

Dicas:

  1. Use a diretiva define ao seu favor!
  2. 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=164402

Defini 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;
}

Editado por bruce845
Link para o comentário
Compartilhar em outros sites

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

Editado por mJi
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...