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

Ajuda com ponteiros de ponteiros


jholxd

Pergunta

Olá amigos eu estou fazendo um programa aqui ele compila certinho só que quando eu vou inserir um caratere no vetor ele da erro no programa e fecha.

eu não sei c para receber o ponteiro de ponteiro dentro da função eu tenho que especificar o **p

segue o código inteiro abaixo

#include <stdio.h>

#include <stdlib.h>

int tam=0;

char inserir(char**p);

char inserirp(char **p);

char alterarp(char **p);

char excluirp(char **p);

char listar(char **p);

char limpar(char **p);

int main()

{

char opcao;

char op;

char *ptr;

ptr = (char*) realloc(NULL, 1* sizeof(char));

do

{

system("cls");

//Menu

printf("**************************De a opcao**************************");

printf("\n1 Para inserir um caractere");

printf("\n2 Para inserir um caractere em uma posicao especifica do vetor");

printf("\n3 Para alterar um determinado caractere do vetor");

printf("\n4 Excluir o caractere de uma determinada posicao");

printf("\n5 Listar todos os caracteres do vetor");

printf("\n6 Limpar o vetor\n\n");

fflush(stdin);

scanf("\n\n%c", &op);

switch(op)

{

case '1':

inserir(&ptr);

break;

case '2':

inserirp(&ptr);

break;

case '3':

alterarp(&ptr);

break;

case '4':

excluirp(&ptr);

break;

case '5':

listar(&ptr);

break;

case '6':

limpar(&ptr);

break;

default:

printf("Não existe a opcao");

getch();

}

system("cls");

printf("Deseja continuar?");

fflush(stdin);

scanf("%c", &opcao);

} while(opcao =='s');

return 0;

getch();

}

char inserir(char **p)

{

int k;

char caractere;

k = tam + 1;

**p = (int*) realloc(**p, k* sizeof(int)); //p = tipo realloc(ponteiro, (tamanho original + 1) definindo o tamanho da variavel)

printf("\nDe o caractere: ");

fflush(stdin);

scanf("%c", caractere);

**(p+k) = caractere;

return 0;

}

char inserirp(char **p)

{

int posicao, k;

char caracter;

printf("\nDigite a posicao: ");

fflush(stdin);

scanf("%i", posicao);

printf("\nDigite o caractere: ");

fflush(stdin);

scanf("%c", caracter);

if ( posicao <= tam)

{

**(p+posicao) = caracter;

}

else

{

k = (posicao - tam) + tam;

**p = (int*) realloc(**p, k* sizeof(int));

**(p+posicao) = caracter;

}

}

char alterarp(char **p)

{

int posicao;

char caracter;

printf("\nDigite a posicao: ");

fflush(stdin);

scanf("%i", posicao);

printf("\nDigite o caractere: ");

fflush(stdin);

scanf("%c", caracter);

if ( posicao <= tam)

{

**(p+posicao) = caracter;

}

else

{

printf("Essa posicao não existe:");

}

}

char excluirp(char **p)

{

int posicao;

printf("\nDigite a posicao: ");

fflush(stdin);

scanf("%i", posicao);

if ( posicao <= tam)

{

**(p+posicao) = 0;

}

else

{

printf("Essa posicao não existe:");

}

}

char listar(char **p)

{

int k;

for (k=1; k<tam; k++)

{

printf(":%c: ",**(p+k));

}

return 0;

}

char limpar(char **p)

{

free(p);

return 0;

}

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Não entendi o que você quer fazer no programa, porque tipo:

char *ptr;

ptr = (char*) realloc(NULL, 1* sizeof(char));

porque você declarou um ponteiro pra char e realocou ele com tamanho igual a 1?

E porque fazer um ponteiro para um caracter e alocar dinamicamente uma posição, seria mais viável ser você quisesse alocar uma string...

Na hora de passar como parametro você faz assim

main(){

...

char *ptr

ptr = func(ptr);

}

char* func (char *p) // isso se você for modificar o ponteiro, terá q retornar as modificações feitas

Espero ter ajudado

Link para o comentário
Compartilhar em outros sites

  • 0

Eu vi aki alguns erros de sintaxe e minha váriavel global não estava incrementando mas agora na minha função lista não lista o primeiro elemento do meu vetor que é expandido dinamicamente.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int tam=0;

char inserir(char**p);

char inserirp(char **p);

char alterarp(char **p);

char excluirp(char **p);

char listar(char **p);

char limpar(char **p);

int main()

{

char opcao;

char op;

char *ptr= NULL; //a primeira vez que passa o ponteiro na função deve ser nula

//ptr = (char*) realloc(NULL, tam* sizeof(char));

do

{

system("cls");

//Menu

printf("**************************De a opcao**************************");

printf("\n1 Para inserir um caractere");

printf("\n2 Para inserir um caractere em uma posicao especifica do vetor");

printf("\n3 Para alterar um determinado caractere do vetor");

printf("\n4 Excluir o caractere de uma determinada posicao");

printf("\n5 Listar todos os caracteres do vetor");

printf("\n6 Limpar o vetor\n\n");

fflush(stdin);

scanf("\n\n%c", &op);

switch(op)

{

case '1':

inserir(&ptr);

break;

case '2':

inserirp(&ptr);

break;

case '3':

alterarp(&ptr);

break;

case '4':

excluirp(&ptr);

break;

case '5':

listar(&ptr);

break;

case '6':

limpar(&ptr);

break;

default:

printf("Não existe a opcao");

getch();

}

system("cls");

printf("Deseja continuar?");

fflush(stdin);

scanf("%c", &opcao);

} while(opcao =='s');

return 0;

getch();

}

char inserir(char **p)

{

int k;

char caractere;

k = ++tam; //incrementa tam e insere em k

*p = (int*) realloc(*p, k* sizeof(int)); //p = tipo realloc(ponteiro, (tamanho original + 1) definindo o tamanho da variavel)

printf("\nDe o caractere: ");

fflush(stdin);

scanf("%c", &caractere); //não ESQUECER DO & NO SCANF NA VÁRIAVEL QUE você ESTA RECEBENDO POR QUE você ESTA RECEBENDO O COMEÇO

*(*p+k) = caractere;

printf("%c", caractere);

printf("\n\n%c", *(*p+k));

getch();

return 0;

}

char inserirp(char **p)

{

int posicao, k;

char caracter;

printf("\nDigite a posicao: ");

fflush(stdin);

scanf("%i", &posicao);

printf("\nDigite o caractere: ");

fflush(stdin);

scanf("%c", &caracter);

if ( posicao <= tam)

{

*(*p+posicao) = caracter;

}

else

{

k = (posicao - tam) + tam;

*p = (int*) realloc(*p, k* sizeof(int));

*(*p+posicao) = caracter;

}

getch();

}

char alterarp(char **p)

{

int posicao;

char caracter;

printf("\nDigite a posicao: ");

fflush(stdin);

scanf("%i", &posicao);

printf("\nDigite o caractere: ");

fflush(stdin);

scanf("%c", &caracter);

if ( posicao <= tam)

{

*(*p+posicao) = caracter;

}

else

{

printf("Essa posicao não existe:");

}

getch();

}

char excluirp(char **p)

{

int posicao;

printf("\nDigite a posicao: ");

fflush(stdin);

scanf("%i", &posicao);

if ( posicao <= tam)

{

*(*p+posicao) = 0;

}

else

{

printf("Essa posicao não existe:");

}

getch();

}

char listar(char **p)

{

int k;

printf("%i", tam);

for (k=0; k<tam; k++)

{

printf("posicao %i :%c: ",k ,*(*p+k));

}

getch();

}

char limpar(char **p)

{

free(*p);

getch();

}

Link para o comentário
Compartilhar em outros sites

  • 0

Eu entendi o conceito do seu código mas ficou um tanto quanto confuso este monte de ponteiros! :)

Um comentário: O que facilitaria muito o código seria, ao invés de as funções receberem ponteiro de ponteiro, retornarem o novo ponteiro. Além disso, funções que não precisam alterar o endeço que o ponteiro está apontando, não precisam receber o ponteiro do ponteiro! Exemplos:

1) Função inserir

char * inserir(char *p)
{
int k;
char caractere, *newp;
k = tam++; //incrementa tam e insere em k
newp = (char*) realloc(p, k* sizeof(char)); //p = tipo realloc(ponteiro, (tamanho original + 1) definindo o tamanho da variavel)
printf("\nDe o caractere: ");
fflush(stdin);
scanf("%c", &caractere); //não ESQUECER DO & NO SCANF NA VÁRIAVEL QUE você ESTA RECEBENDO POR QUE você ESTA RECEBENDO O COMEÇO

newp[k] = caractere;
printf("%c", caractere);
printf("\n\n%c", newp[k]);
getch();

return newp;
}
2) Função listar
void listar(char *p)
{
int k;

printf("%i", tam);
for (k=0; k<tam; k++)
{
printf("posicao %i :%c: ",k ,p[k]);
}

getch();
}

Note que na função inserir o ++tam foi alterado para tam++ pois da forma que estava você sempre está inserindo na próxima posição pois primeiro tam é incrementado e depois ele é atribuído a k.

Outra coisa que não entendi no seu código: você quer armazenar caracteres, correto? Porque você aloca memória como int? Isso está incorreto! Utilize char onde está int nos ponteiros.

Um último comentário: funções que não retornam nada declare como void! Algumas de suas funções não retornam nada e mesmo assim estão sendo declaradas como char.

Link para o comentário
Compartilhar em outros sites

  • 0

Então eu dei uma arrumada no código está agora tudo funcionando só uma coisa não consegui fazer quando eu seleciono a opção 1 e insiro um caracter e ele sempre coloca + 1 espaço vazio do vetor e eu não queria isso alguém sabe resolver isso?

obs: nas opções que eu altero o tamanho do vetor eu devo manter ponteiro para ponteiro né ?

segue o código:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int tam=0;

void inserir(char**p);

void inserirp(char **p);

void alterarp(char **p);

void excluirp(char **p);

void listar(char **p);

void limpar(char **p);

int main()

{

char opcao = 'n';

char op;

char *ptr= NULL; //a primeira vez que passa o ponteiro na função deve ser nula

do

{

system("cls");

//Menu

printf("**************************De a opcao**************************");

printf("\n1 Para inserir um caractere");

printf("\n2 Para inserir um caractere em uma posicao especifica do vetor");

printf("\n3 Para alterar um determinado caractere do vetor");

printf("\n4 Excluir o caractere de uma determinada posicao");

printf("\n5 Listar todos os caracteres do vetor");

printf("\n6 Limpar o vetor");

printf("\n7 Sair\n\n");

fflush(stdin);

scanf("\n\n%c", &op);

switch(op)

{

case '1':

inserir(&ptr);

break;

case '2':

inserirp(&ptr);

break;

case '3':

alterarp(&ptr);

break;

case '4':

excluirp(&ptr);

break;

case '5':

listar(&ptr);

break;

case '6':

limpar(&ptr);

break;

case '7':

{

printf("\n\nDeseja realmente sair?");

fflush(stdin);

scanf("%c", &opcao);

}

break;

default:

{

system("cls");

printf("Não existe a opcao");

printf("\n\nPressiona qualquer tecla para continuar");

getch();

}

}

}while(opcao =='n');

system("cls");

printf("\n\nPressiona qualquer tecla para continuar\n\n");

return 0;

getch();

}

void inserir(char **p)

{

int k=0;

char caractere;

printf("%i", k);

k = tam++; //incrementa tam e insere em k

*p = (char*) realloc(*p, k* sizeof(char)); //p = tipo realloc(ponteiro, (tamanho original + 1) definindo o tamanho da variavel)

printf("%i", k);

printf("\nDe o caractere: ");

fflush(stdin);

scanf("%c", &caractere); //não ESQUECER DO & NO SCANF NA VÁRIAVEL QUE você ESTA RECEBENDO POR QUE você ESTA RECEBENDO O COMEÇO

*(*p+k) = caractere;

printf("Caractere inserido '%c' inserido com sucesso", caractere);

getch();

return 0;

}

void inserirp(char **p)

{

int posicao, k;

char caracter;

printf("\nDigite a posicao: ");

fflush(stdin);

scanf("%i", &posicao);

printf("\nDigite o caractere: ");

fflush(stdin);

scanf("%c", &caracter);

if ( posicao <= tam)

{

*(*p+posicao) = caracter;

printf("\nCaractere '%c' inserido com sucesso", caracter);

}

else

{

k = (posicao - tam) + tam;

tam = k;

*p = (char*) realloc(*p, k* sizeof(char));

*(*p+posicao) = caracter;

printf("\nCaractere '%c' inserido com sucesso", caracter);

}

printf("\n\nPressiona qualquer tecla para continuar");

getch();

}

void alterarp(char **p)

{

int posicao;

char caracter;

printf("\nDigite a posicao: ");

fflush(stdin);

scanf("%i", &posicao);

printf("\nDigite o caractere: ");

fflush(stdin);

scanf("%c", &caracter);

if ( posicao <= tam)

{

*(*p+posicao) = caracter;

printf("Caracter alterado com sucesso");

}

else

{

printf("Essa posicao não existe:");

}

printf("\n\nPressiona qualquer tecla para continuar");

getch();

}

void excluirp(char **p)

{

int posicao;

printf("\nDigite a posicao: ");

fflush(stdin);

scanf("%i", &posicao);

if ( posicao <= tam)

{

int k, x;

x = tam--;

for(k=posicao; k<tam+1; k++)

{

*(*p+k) = *(*p+(k+1));

}

*p = (char*) realloc(*p, x* sizeof(char));

printf("Caractere excluido com sucesso");

}

else

{

printf("Essa posicao não existe:");

}

printf("\n\nPressiona qualquer tecla para continuar");

getch();

}

void listar(char **p)

{

int k;

if(tam == 0)

{

printf("\nNao há caracteres no vetor");

getch();

return;

}

printf("numero de caracteres no vetor e de %i:", tam);

for (k=0; k<=tam; k++)

{

printf("\n\nposicao %i :%c: ",k ,*(*p+k));

}

printf("\n\nPressiona qualquer tecla para continuar");

getch();

}

void limpar(char **p)

{

free(*p);

tam =0;

printf("\nVetor Limpo!!");

printf("\n\nPressiona qualquer tecla para continuar");

getch();

}

desculpe o código estar mal comentado mas eu não sei o q comentar, vou tirar alguns ponteiros de ponteiros que eu acho que não é necessário e comentar o que cada função faz para ver se melhoro o entendimento do código.

Link para o comentário
Compartilhar em outros sites

  • 0

Na verdade nenhuma das funções precisaria de ponteiro para ponteiro! Basta retornar o novo ponteiro assim como eu fiz na função inserir que fiz lá em cima!

Um erro que eu vi agora: o realloc deve utilizar tam e não k! A alocação deveria ficar:

newp = (char*) realloc(p, tam * sizeof(char)); //p = tipo realloc(ponteiro, (tamanho original + 1)
O motivo de exibir um item a mais é que na função listar o seu for teria que ser:
for (k=0; k<tam; k++)

Usar o <= é que gera o problema.

Editado por Marcelo Utikawa da Fonseca
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,1k
    • Posts
      651,8k
×
×
  • Criar Novo...