Jump to content
Fórum Script Brasil
  • 0

Leitura de uma string em um vetor de ponteiro de string


Kaio21

Question

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

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

Edited by mJi
Link to comment
Share on other 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).

Edited by Kaio21
Link to comment
Share on other 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;
}

Edited by bruce845
Link to comment
Share on other 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.

Edited by mJi
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...