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

Aian Arnaud

Pergunta

GALERA, FIZ O CÓDIGO TODO E ESTÁ FUNCIONANDO. PORÉM, NA HORA DE USAR A FUNÇÃO FREE(), APARECE EXITED WITH NON ZERO STATUS E DÁ ERRO NO CODIGO, alguém PODE ME AJUDAR

 

#include <stdio.h>
#include <stdlib.h>

char Alocar(char *p, int c){
  p=(char*) malloc(c*sizeof(char));
}
 
int main(){
  
  int i, j, x;
    
  printf("Digite o tamanho da string: ");
  scanf("%d", &x);
    
  char *ptr, vogais[10]= "aeiouAEIOU", nada[1]="";
    
  Alocar(ptr, x);
    
  if(ptr==NULL){
    printf("FAIL");
    exit(1);
  }
    
  printf("Digite sua string com %d caracteres (espaço conta como caractere): \n", x);
  scanf(" %[^\n]s", ptr);
    
  printf("\n");
  printf("\n");
  printf("*****String sem vogais*****\n");
  printf("\n");
    
  for(i=0; i<x; i++){
    for(j=0; j<10; j++){
      if(ptr==vogais[j]){
        ptr=nada[0];
      }
    }
    printf("%c", ptr);
  }
    
  free(ptr);
  ptr=NULL;
    
  return 0;
}

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Olá. Depois de várias tentativas té consegui fazer o seu código rodar no Visual Studio 2017. Mas é o seguinte:

A sua função está declara com o tipo de retorno char, mas ela não retorna nada. Teria ou q declarar ela como void ( sem retorno ) ou retornar alguma coisa.

Outro ponto é q declarei sua variável "ptr" como uma String, como vai ver no código. Se deixar ela como um ponteiro no Visual Studio pede para inicializá-la e nesse caso seria uma boa prática de programação inicializá-la como NULL.

Tbém foi preciso fazer pequenas mudanças dentro do seu for, mas especificamente no if, como vai ver abaixo.

No DevC++ o código rodou bem, declarando a variável como um ponteiro ( como você fez ) e fazendo a alocação e liberação da memória. Mas no Visual Studio inda não sei qual é o erro q está dando. Sei q se iniciar a mesma com o valor NULL, dá erro nas 2 compiladores.

Dá uma olhada no código e ver se ajuda em alguma coisa. Inda estou a pouco tempo estudando C. Então inda não tenho uma resposta mais precisa para te dar.

Segue o código do Visual Studio:

// AlocacaoDeMemoria.cpp : define o ponto de entrada para o aplicativo do console.
//


#include <stdio.h>
#include <stdlib.h>

void Alocar(char *p, int c) {
	p = (char *) malloc(c * sizeof(char));
}

int main() {

	int i, j, x;
	char ptr[50], vogais[] = "aeiouAEIOU", nada[4] = "";
	char *limparBuffer;

	printf("Digite o tamanho da string: ");
	scanf("%d", &x);
	scanf("%c", &limparBuffer);

	printf("Digite sua string com %d caracteres (espaco conta como caractere): ", x);
	scanf("%s", ptr);
	scanf("%c", &limparBuffer);

	printf("\n");
	printf("\n");
	printf("*****String sem vogais*****\n");
	printf("\n");

	for (i = 0; i < x; i++) {
		for (j = 0; j < 10; j++) {
			if (ptr[i] == vogais[j]) {
				ptr[i] = nada[0];
			}
		}
		printf("%c", ptr[i]);
	}

	printf("\n\n");

	system("pause");

	return 0;
}

Na parte onde tem o scanf("%c" &limparBuffer); é uma linha q é ignorada pelo compilador, serve apenas para limpar o buffer de entrada.

Se tiver algo que possa ter ajudado com essa minha dica fala, ok?

Outro ponto: você está alocando sua variável ptr e depois, no decorrer do código, está alterando ela, na parte do for, dentro do if, onde ela recebe o valor nada[0]!? Me parece estranho isso. E é nessa parte q está dando erro no Visual Studio se deixar a mesma como você declarou. Teria q ver isso.

Só mais uma pergunta: Qual compilador você está usando?

Só mais uma pergunta: Qual compilador você está usando?

Link para o comentário
Compartilhar em outros sites

  • 0

Só corrigindo: Para ler uma String com espaço em branco seria como você fez mesmo, senão dá erro.

printf("Digite sua string com %d caracteres (espaco conta como caractere): ", x);
scanf(" %[^\n]s", ptr);
scanf("%c", &limparBuffer);

 

Link para o comentário
Compartilhar em outros sites

  • 0

Olá de novo. Baseado no seu exercício criei outro, dessa vez sem ter q pedir para o usuário o tamanho da String.

Quanto a questão da alocação dinâmica de memória me desculpa mas não consegui descobrir o por quê do erro q tá dando. E só corrigindo... quanto a sua função Alocar() está tudo ok com ela. Não tem nenhum problema em definir uma função em C com o tipo de retorno char e ao mesmo tempo não retornar nada. É q estou acostumado com Java. Aí sim se você criar um método com um tipo de retorno e não retornar nada seu código não vai nem compilar.

Segue o exercício do modo como fiz, baseado na lógica q você usou:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"


int main()
{
	char texto[50], nada[5] = "";
	char vogais[] = {"aeiouAEIOU"};
	char *limparBuffer;
	int i, j, x;
	char *c;

	printf("\nInforme sua String (espacos também contam): ");
	scanf("%[^\n]s", texto);
	scanf("%c", &limparBuffer);

	x = strlen(texto);

	printf("\nString sem as vogais: ");

	for (i = 0; i < x; i++)
	{
		for (j = 0; j < 10; j++)
		{
			if (texto[i] == vogais[j])
			{
				texto[i] = nada[0];
			}
		}

		printf("%c", texto[i]);
	}

	printf("\n");

	scanf("%c", &c);

	return 0;
}

 

Link para o comentário
Compartilhar em outros sites

  • 0
Em 17/12/2017 at 17:33, Aian Arnaud disse:

GALERA, FIZ O CÓDIGO TODO E ESTÁ FUNCIONANDO. PORÉM, NA HORA DE USAR A FUNÇÃO FREE(), APARECE EXITED WITH NON ZERO STATUS E DÁ ERRO NO CODIGO, alguém PODE ME AJUDAR

O problema é a causa de que você está esperando um ponteiro simples quando deveria estar esperando um ponteiro duplo na sua função alocar.

#include <stdio.h>
#include <stdlib.h>

void Alocar(char **p, int c) {
    *p = (  char* ) malloc( c * sizeof(char) );
}

int main() {

    int i, j, x;

    printf("Digite o tamanho da string: ");
    scanf("%d", &x);

    char *ptr = NULL, vogais[10]= "aeiouAEIOU", nada[1]="";

    Alocar( &ptr, x );

    if(ptr==NULL) {
        printf("FAIL");
        exit(1);
    }

    printf("Digite sua string com %d caracteres (espaço conta como caractere): \n", x);
    scanf(" %[^\n]s", ptr);

    printf("\n");
    printf("\n");
    printf("*****String sem vogais*****\n");
    printf("\n");

    for(i=0; i<x; i++) {
        for(j=0; j<10; j++) {
            if(ptr[i]==vogais[j]) {
                ptr[i]=nada[0];
            }
        }
        printf("%c", ptr[i]);
    }

    free(ptr);
    ptr=NULL;

    return 0;
}

Quando eu tenho uma função como esta:
void alocar(char *p)

...e paso isso:
char * ptr;
alocar (ptr);

...é como si tivesse fazendo isso em realidade:
char *ptr;
char *p;
p = ptr;

primeiro entender que ptr é uma variável "selvagem"(aponta a qualquer lugar) pois não foi inicializada. Quando eu faço a chamada da função alocar (ptr) e passo ptr, é como si estivesse fazendo p = ptr, agora p pasa a ser uma copia de ptr, e portanto aponta ao mesmo lugar que ptr. E O MAIS IMPORTANTE!!!! Se manipular p você ESTA MANIPULANDO UMA CÓPIA DE PTR E NÃO REALMENTE A PTR, que é p pois ptr não foi passado por referencia e sim por cópia!!! Não lhe falei que fazer alocar(ptr) é o mesmo que fazer p = ptr? Então! você esta fazendo uma copia do que aponta p, mas em realidade ao modificar p dentro da função, p sim vai receber a nova direção do malloc onde o array foi alocado, porem ptr continuará apontando para onde apontava, para um lugar qualquer da memória. Por isso seu programa falha.

Para manipular uma variável indiretamente eu preciso de um ponteiro certo? E para manipular um ponteiro indiretamente que necessito? UM PONTEIRO DUPLO!!!! Por isso sua função deve estar esperando um ponteiro por referencia. É algo complicado de entender porem é assim. Somente pense que se eu preciso passar char *ptr a função precisa esperar char **p, se eu quero passar char **ptr a função deve esperar char ***ptr, e assim sucessivamente, se não eu estou alterando uma copia, e não a original. Isso é o principio básico dos ponteiros, se quero alterar uma variável dentro de outra função devo passar essa variável por referencia. Lembra?

Se continuar com dificuldades para entender pergunte.

Se continuar com dificuldades para entender pergunte.

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,3k
    • Posts
      652,3k
×
×
  • Criar Novo...