jholxd 0 Denunciar post Postado Junho 4, 2008 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
José Enésio 4 Denunciar post Postado Junho 5, 2008 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