Jump to content
whoami-r

Remover caracteres que não sejam letras e espaços

Recommended Posts

whoami-r

Boas pessoal, tenho o seguinte problema: 

Citação

Desenvolva um programa que leia uma frase introduzida pelo utilizador e lhe retire todos os caracteres que não sejam letras nem espaços. No final o programa deverá mostrar a frase atualizada. Exemplos de execução:

Introduza uma frase: 0p.rogra5%mac9ao1./4

Frase com apenas letras e espacos: programacao

Queria que me ajudassem a tentar descobrir como é que removo os tais caracteres da string

Share this post


Link to post
Share on other sites
whoami-r
21 horas atrás, HappyHippyHippo disse:

o problema é "remover" ou detectar ?

o problema é remover os caracteres que não interessam, mostrando só a palavra programação sem o "lixo"

Share this post


Link to post
Share on other sites
Rui Carlos

Para remover o caracter numa posição de uma string, podes simplesmente ir a cada um dos caracteres seguintes, e movê-los um posição para trás.  Deverás fazer isto do início para o fim, e deverás copiar também o \0 final.

Share this post


Link to post
Share on other sites
HappyHippyHippo

O problema é só ler a frase e apresentar o resultado? Não existe a necessidade de guardar a frase tanto na memória inicial ou numa secundária, certo? 


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Rui Carlos
11 minutos atrás, HappyHippyHippo disse:

O problema é só ler a frase e apresentar o resultado? Não existe a necessidade de guardar a frase tanto na memória inicial ou numa secundária, certo? 

Tendo em conta o enunciado, diria que há.

Share this post


Link to post
Share on other sites
HappyHippyHippo
3 minutes ago, Rui Carlos said:

Tendo em conta o enunciado, diria que há.

Pelo contrário... Pelo enunciado que apresentaste, só necessitas de guardar o que o utilizador escreveu e fazer o parse directo para a consola. Tens a certeza que o que escreveste é exactamente o que tens no enunciado? 


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
whoami-r
14 minutos atrás, HappyHippyHippo disse:

Pelo contrário... Pelo enunciado que apresentaste, só necessitas de guardar o que o utilizador escreveu e fazer o parse directo para a consola. Tens a certeza que o que escreveste é exactamente o que tens no enunciado? 

Sim tudo aquilo que está no enunciado é aquilo que apareceu num exame

Share this post


Link to post
Share on other sites
Rui Carlos
16 minutos atrás, HappyHippyHippo disse:

Pelo contrário... Pelo enunciado que apresentaste, só necessitas de guardar o que o utilizador escreveu e fazer o parse directo para a consola. Tens a certeza que o que escreveste é exactamente o que tens no enunciado? 

O enunciado fala em remover os caracteres, e depois ("no final") em mostrar o resultado.  Por isso diria que ignorar os caracteres ao imprimir não faz o que se pede no enunciado.

Para mim uma solução num teste que não apresentasse um procedimento dedicado a remover os caracteres não teria a cotação toda.  Uma solução que só removesse na impressão provavelmente não teria metade, por muito inteligente que a solução seja.  Por vezes os enunciados nem são suficientemente específicos para permitir descartar soluções menos "completas", mas acho que nem é o caso.  (Mas isto sou eu, que não acho que os alunos deviam desde cedo aprender a separar computação da interacção com o utilizador.)

Em todo o caso, diria que "guardar o que o utilizador escreveu" já implica guardar a frase em memória, não?

Share this post


Link to post
Share on other sites
whoami-r
2 horas atrás, Rui Carlos disse:

O enunciado fala em remover os caracteres, e depois ("no final") em mostrar o resultado.  Por isso diria que ignorar os caracteres ao imprimir não faz o que se pede no enunciado.

Para mim uma solução num teste que não apresentasse um procedimento dedicado a remover os caracteres não teria a cotação toda.  Uma solução que só removesse na impressão provavelmente não teria metade, por muito inteligente que a solução seja.  Por vezes os enunciados nem são suficientemente específicos para permitir descartar soluções menos "completas", mas acho que nem é o caso.  (Mas isto sou eu, que não acho que os alunos deviam desde cedo aprender a separar computação da interacção com o utilizador.)

Em todo o caso, diria que "guardar o que o utilizador escreveu" já implica guardar a frase em memória, não?

Outro exemplo de outro exercício que achei parecido com este: 

Desenvolva um programa que leia uma frase e uma palavra introduzidas pelo utilizador, e apresente a frase introduzida sem a primeira ocorrência da palavra, caso exista. Uma frase é um conjunto de palavras separadas por um ou mais espaços. O programa deve ser indiferente a letras minúsculas ou maiúsculas.

Exemplo de execução 1:

Frase: Todos˽juntos˽por˽uma˽causa

Palavra: juntos Resultado: Todos˽˽por˽uma˽causa

 

Exemplo de execução 2:

Frase: Sorrir˽ou˽não˽sorrir!

Palavra: sorrir Resultado: ˽ou˽não˽sorrir!

 

 

O caracter ‘˽’ presente nos exemplos de execução representa um espaço em branco

Share this post


Link to post
Share on other sites
Rui Carlos

Antes de passares para outro exercício, já conseguiste resolver o anterior?

O @HappyHippyHippo são sugeriu uma solução simples para o problema (que não é propriamente a que eu recomendaria :D), e também já te indiquei o algoritmo naive para remover caracteres de uma string.

Share this post


Link to post
Share on other sites
whoami-r
50 minutos atrás, Rui Carlos disse:

Antes de passares para outro exercício, já conseguiste resolver o anterior?

O @HappyHippyHippo são sugeriu uma solução simples para o problema (que não é propriamente a que eu recomendaria :D), e também já te indiquei o algoritmo naive para remover caracteres de uma string.

Ainda não sou um pro nisto, nem perto disso xD, será que podias explicar de uma forma mais simples esse tal algoritmo "naive"?

Share this post


Link to post
Share on other sites
Rui Carlos

Sabes fazer um ciclo que percorre todo um array, do início para o fim, e para cada posição i, coloca lá o valor da posição i+1?  (Se a resposta for não, então podes começar por ver isto.)

O passo seguinte é em vez de começares do início, começares numa posição que tenha um carácter que queiras remover.

Share this post


Link to post
Share on other sites
Inacabado

Muito boa tarde. desculpem meter-me na discussão, até porque é um programa que tambem teria interesse em saber resolver. Nao se poderia guardar a a frase so com letras do alfabeto numa substring da string/problema inicial? Teoricamente pode-se fazer muita coisa,dirão....

Share this post


Link to post
Share on other sites
HappyHippyHippo

o que na realidade é então para fazer será (limitando o tamanho dos dados e entrada para tornar as coisas mais simples) :

- ler os dados do utilizador para um buffer qualquer

- criar um segundo buffer do mesmo tamanho do primeiro

- iterar por todas os caracteres do primeiro buffer, e inserir no segundo caso for um caracter aceito (existe já funções para essa verificação ...)

- não esquecer de sinalizar o fim da segunda string com o caracter '\0'

- apresentar o segundo buffer como a solução pretendida

 

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Inacabado

Eu fiz este código mas não me está a dar e já dei umas quantas voltas e nada...

Agradecia imenso uma "dica" que me desbloqueasse este problema, obrigado.

/* Faça um programa que retira de uma string introduzida todos os caracteres que nao sejam 
alfabeto e apresente a nova string*/
#include <stdio.h>
#include <stdbool.h>
#define SIZE 20
	
char *onlyAlpha(char *str)	
{
	char str1[SIZE];
	char *tmp=str1;
	int i;
	bool Alpha=true;
	for(i=0;str[i]!='\0';++i)
	{
		while(Alpha)
		{
			if((str[i]>='A'&& str[i]<='Z')||(str[i]>='a'&& str[i]<='z')||str[i]=='\0')
				str1[i]==str[i];
			else
				Alpha=false;
		}
	}
return 	tmp;
}
int main(void)
{
	int i;
	char str[20];
	
	printf("Introduza uma string: "); gets(str);
	onlyAlpha(str);	
	printf("String só com letras: %s.\n",str);
return 0;
}

Este código tem um comportamento inesperado e não encontro o erro!

No entretanto vou continuar a tentar investigar melhor o que se passa...

Abraço a todos.

Share this post


Link to post
Share on other sites
Inacabado

Codigo alterado, este é o ultimo mas o problema persiste:

/* Faça um programa que retira de uma string introduzida todos os caracteres que nao sejam 
alfabeto e apresente a nova string*/
#include <stdio.h>
#include <stdbool.h>
#define SIZE 20
	
char *onlyAlpha(char *str)	
{
	char str1[SIZE];
	char *tmp=str1;
	int i;
	bool Alpha=true;
	for(i=0;str[i]!='\0';i++)
	{
		while(Alpha)
		{
			if((str[i]>='A'&& str[i]<='Z')||(str[i]>='a'&& str[i]<='z')||str[i]=='\0')
				str1[i]=str[i]; /*alterado o == por =*/
			else
				Alpha=false;
		}
	}
	str1[i]='\0';/*acrescentado*/
return 	tmp;
}
int main(void)
{
	int i;
	char str[20];
	
	printf("Introduza uma string: "); gets(str);
	char *ptr=onlyAlpha(str);/*acrescentei o ponteiro *ptr*/	
	printf("String só com letras: \n");
	puts(ptr);/*acrescentado*/
return 0;
}

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

assim de repente, vejo três grandes problemas:

- o mais simples de perceber é que no teu ciclo de popular o segundo array só com os caracteres "alpha", quando a variável "Alpha" toma o valor de falso, nunca mais volta a ser verdadeiro, logo nunca irás copiar os caracteres após um caracter descartado

- nesse mesmo ciclo, estás a copiar do array original para o segundo array, para a mesma posição, no entanto, se já descartaste um caracter, quer dizer que a posição final não é a mesma, pois não ?

- existe um erro muito grave, mas de mais difícil compreensão. o que a tua função retorna, é a posição de memória de um bloco reservado dentro da função, que no fim desta, deixa de "existir". Por outras palavras, estás a retornar algo que dentro de momentos (após o retorno) pode ou não estar na posição retornada. a maneira mais simples é teres a função main a instanciar os dois arrays e a função fazer só o trabalho de filtragem e cópia para o segundo array,

  • Vote 2

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Inacabado

Muito obrigado pela dica, vou aplicar o que percebi da tua resposta no programa.

Abraço. ;)

Share this post


Link to post
Share on other sites
Inacabado

Ora aqui está (continua com comportamento estranho...), com as alterações que compreendi dos esclarecimentos dados pelo HHH.

O código:

#include <stdio.h>
#include <stdbool.h>
#define SIZE 20
	
char *onlyAlpha(char *str,char *str1)	
{
	char *tmp=str1;
	int i,j;
	bool Alpha;
	for(i=j=0;str[i]!='\0';i++,j++)
	{
      	Alpha=true;/*acrescentado*/
		while(Alpha)
		{
			if((str[i]>='A'&& str[i]<='Z')||(str[i]>='a'&& str[i]<='z')||str[i]=='\0')
				str1[j]=str[i];
			else
			{
				Alpha=false;/*acrescentado*/
				j--;/*acrescentado*/
			}
		}
	}
	str1[j]='\0';
return 	str1=tmp; /*devolve o endereço inicial the str1*/
}
int main(void)
{
	int i;
	char str[SIZE],str1[SIZE];/*acrescentado o novo array str1 na função main()*/
	
	printf("Introduza uma string: "); gets(str);
	onlyAlpha(str,str1);/*envio dos dois arrays a função onlyAlpha*/	
	printf("String só com letras: \n");
	puts(str1);
return 0;
}

 

Edited by Inacabado

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.