jholxd Postado Maio 29, 2008 Denunciar Share Postado Maio 29, 2008 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 **psegue 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;} Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest kassi Postado Maio 29, 2008 Denunciar Share Postado Maio 29, 2008 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 assimmain(){ ... char *ptr ptr = func(ptr);}char* func (char *p) // isso se você for modificar o ponteiro, terá q retornar as modificações feitasEspero ter ajudado Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 jholxd Postado Maio 30, 2008 Autor Denunciar Share Postado Maio 30, 2008 o meu vetor eu quero que seja digamos justo tipo para cada caractere que eu colocar eu aumento o vetore se indico uma posição maior que o tamanho que eu tenho eu aumento o vetor até aquela posição. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 jholxd Postado Junho 3, 2008 Autor Denunciar Share Postado Junho 3, 2008 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");//Menuprintf("**************************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();} Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Marcelo Utikawa da Fonseca Postado Junho 3, 2008 Denunciar Share Postado Junho 3, 2008 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 inserirchar * 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 jholxd Postado Junho 4, 2008 Autor Denunciar Share Postado Junho 4, 2008 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Marcelo Utikawa da Fonseca Postado Junho 4, 2008 Denunciar Share Postado Junho 4, 2008 (editado) 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 Junho 4, 2008 por Marcelo Utikawa da Fonseca Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
jholxd
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
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.