Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jholxd

função

Recommended Posts

Amigo eu estou com um problema quando eu acesso a primeira funcao do meu programa "inserir" eu queria que toda a vez que ele acessar essa função ele reserve +1 espaço na memória e coloque um caracter só que ele libera 2 alguém poderia me ajudar?

 

#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 leva a opção para função correspondente
{
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) //Funcao que insere um caracter em sequencia do ultimo inserido e dimenciona o vetor para o numero de caracters existentes
{
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); //NAO 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) //insere um caracter numa posicao qualquer se ela não existe dentro do vetor é realocado a memória até esse vetor
{
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) //alterar um caractere dentro do vetor existente não redimenciona o vetor
{
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) //tira o caracter do do vetor e recoloca os outros caracteres e redimenciona o vetor
{
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) //mostra o vetor existente
{
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) //limpa o vetor
{
free(*p);
tam =0;
printf("\nVetor Limpo!!");
printf("\n\nPressiona qualquer tecla para continuar");
getch();
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja esta linha:

 

for (k=0; k<=tam; k++)
{
printf("\n\nposicao %i :%c: ",k ,*(p+k));
}

Tente inserir isso aqui:

for (k=0; k<=tam; k++)
{
printf("\n\nposicao %i :%c: ",k ,*(p+k));
if(*(p+k) == '\0')
{
		  printf("eh caractere null \\0");
}
}

Se o problema que você está achando é o mesmo que eu to pensando, ele tem uma posição em branco no final, isso é apenas o caractere nulo que termina a string ('\0'). Isso tem que ter na string, você não vai poder lutar com ele. O jeito é ignorá-lo através de um if que termina o loop. Veja:

for (k=0; k<=tam; k++)
{
if(*(p+k) == '\0') break;
printf("\n\nposicao %i :%c: ",k ,*(p+k));
}

Tenta aí!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.