Colocar Resposta 
 
Avaliação do Tópico:
  • 0 votos - 0 Média
  • 1
  • 2
  • 3
  • 4
  • 5
Dúvidas de C (Eclipse)
13-10-2009, 22:02 (Esta mensagem foi modificada pela última vez a: 13-10-2009 22:03 por Pirotas.)
Mensagem: #1
Ubuntu Dúvidas de C (Eclipse)
Olá a todos,

iniciei-me há pouquíssimo tempo nesse mundo estranho da linguagem C, por obrigação académica claro, e já estou a necessitar de ajuda. Não é que eu queira que programem por mim mas nesta altura do campeonato ainda nem sei bem distinguir seja lá o que for.

Sendo mais directo, pediram-me isto:

Escreva uma função que recebe dois argumentos, uma string e um caracter, e que remove todas as ocorrências do caracter da string. Coloque esta função num programa, em que é mostrado o conteúdo da string antes e depois de ser processada.

Eu queria fazer

-receber string, receber caracter (como é para testar já devem estar declarados)
-ler posição da string
-comparar com caracter
-se igual, escreve noutra string
-se diferente, salta para a próxima posição
-escrever string, escrever string sem caracter.

Já me disseram que para isto terei problemas com a nova variável e que o que deverá ser feito é apagar o caracter na string.

Daqui é que já não consigo passar, será que alguém pode ajudar?
Não se esqueçam que sou mesmo mas mesmo muito fresquinho nisto da programação.

Falta uma coisa, VMware a correr Alinex com o Eclipse instalado.

Cumprimentos
PirotasCool
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
13-10-2009, 23:41 (Esta mensagem foi modificada pela última vez a: 15-10-2009 10:22 por rei007.)
Mensagem: #2
RE: Dúvidas de C (Eclipse)
Boas,

Vê se isto te ajuda. Fiz esse trabalhinho para si e testei. No meu computador funcionou mas tive de fazer em windows 7 com visual studio 8 num compilador de C++. Não sei se vai funcionar nos seus requesitos. Experimenta e depois diz algo.
Código:
#include <stdio.h>
#include <string.h>

char *removerCaracteres(char *stringParaTratar, char caracterParaRemover);

void main(void)
{
     char stringParaTratar[80];
     char *stringTratada;
     char caracterParaRemoverNaString;
    
     printf("Introduza a sua string: ");
     fflush(stdin);
     scanf("%s",&stringParaTratar);
    
     printf("\n\nIntroduza o caracter que quer remover da string: ");
     fflush(stdin);
     scanf("%c",&caracterParaRemoverNaString);
    
     stringTratada = removerCaracteres(stringParaTratar,caracterParaRemoverNaString);
    
     printf("\n\nA sua string original era: %s", stringParaTratar);
     printf("\nA sua string tratada e: %s", stringTratada);
    
     fflush(stdin);
     getchar();
}

char *removerCaracteres(char *stringParaTratar, char caracterParaRemover)
{
     char *stringParaDevolver;
    
     size_t tamanhoDaString;
    
     int i;
     int j;
    
     tamanhoDaString = 0;
     i=0;
     j=0;
     stringParaDevolver = NULL;
    
     tamanhoDaString = strlen(stringParaTratar);//vê a quantidade de caracteres da string

     stringParaDevolver = (char *) malloc( sizeof( char ) * tamanhoDaString + 1 ); //Alocar memória

     memset( stringParaDevolver, 0x00, sizeof( char ) * tamanhoDaString + 1 );//Inicialização de uma secção de memória
    
     for(i=0; i<tamanhoDaString; i++)
     {
              if(stringParaTratar[i]!=caracterParaRemover)//Se o caracter da string for diferente do caracter a remover coloca numa nova string, caso contrário remove
              {
                      stringParaDevolver[j] = stringParaTratar[i];
                      j++;
              }
     }
    
     return (stringParaDevolver); //devolve o valor da nova string sobre o formato de ponteiro
}

Cumps,
Manuel Rocha

[Imagem: pplware_staff.png]
Licenciado em Informática para a Saúde pela ESTG Leiria
Mestrado em Informática - Especialização em Sistemas de Informação na Universidade Portucalense
Especialização em Design Gráfico
Visitar Website de este utilizador Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
14-10-2009, 00:25
Mensagem: #3
RE: Dúvidas de C (Eclipse)
Desde já obrigado pela disponibilidade.

1º Deu um erro que para o qual já me tinham alertado, assim que fazemos "Enter" não me possibilita definir qual o caracter a retirar e devolve o seguinte:

Introduza a sua string: esta string é de teste

Introduza o caracter que quer remover da string:

A sua string original era: esta
A sua string tratada e: esta


julgo que tem a ver com o scanf e o \0 Sad

2º Parece-me que o ciclo for é o indicado

3º Agora que vi este código lembrei-me: deve-se trabalhar a string em questão é não criar outra, ou seja deve-se fazer o printf("%s\n",str), trabalhar a str retira_char(str,c), devolvê-la ao main.c e fazer de novo printf.

Vou ver se consigo trabalhar a partir daqui Wink

Cumprimentos
PirotasCool
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
14-10-2009, 01:15 (Esta mensagem foi modificada pela última vez a: 15-10-2009 10:23 por rei007.)
Mensagem: #4
RE: Dúvidas de C (Eclipse)
Peço imensa desculpa pelo transtorno mas a verdade é que não tinha testado strings com espaços.

A função continua correcta. O problema estava em como eu obtinha os dados no scanf.

Aqui tem a versão correcta. Experimente e dê-me o seu feedback.
Código:
#include <stdio.h>
#include <string.h>

char *removerCaracteres(char *stringParaTratar, char caracterParaRemover);

void main(void)
{
     char stringParaTratar[80];
     char *stringTratada;
     char caracterParaRemoverNaString;
    
     printf("Introduza a sua string: ");
     fflush(stdin);
     scanf("%[^\n]",stringParaTratar); //erro estava aqui
    
     printf("\n\nIntroduza o caracter que quer remover da string: ");
     fflush(stdin);
     scanf("%c",&caracterParaRemoverNaString);
    
     stringTratada = removerCaracteres(stringParaTratar,caracterParaRemoverNaString);
    
     printf("\n\nA sua string original era: %s", stringParaTratar);
     printf("\nA sua string tratada e: %s", stringTratada);
    
     fflush(stdin);
     getchar();
}

char *removerCaracteres(char *stringParaTratar, char caracterParaRemover)
{
     char *stringParaDevolver;
    
     size_t tamanhoDaString;
    
     int i;
     int j;
    
     tamanhoDaString = 0;
     i=0;
     j=0;
     stringParaDevolver = NULL;
    
     tamanhoDaString = strlen(stringParaTratar);//vê a quantidade de caracteres da string

     stringParaDevolver = (char *) malloc( sizeof( char ) * tamanhoDaString + 1 ); //Alocar memória

     memset( stringParaDevolver, 0x00, sizeof( char ) * tamanhoDaString + 1 );//Inicialização de uma secção de memória
    
     for(i=0; i<tamanhoDaString; i++)
     {
              if(stringParaTratar[i]!=caracterParaRemover)//Se o caracter da string for diferente do caracter a remover coloca numa nova string, caso contrário remove
              {
                      stringParaDevolver[j] = stringParaTratar[i];
                      j++;
              }
     }
    
     return (stringParaDevolver); //devolve o valor da nova string sobre o formato de ponteiro
}

Cumps,
Manuel Rocha

[Imagem: pplware_staff.png]
Licenciado em Informática para a Saúde pela ESTG Leiria
Mestrado em Informática - Especialização em Sistemas de Informação na Universidade Portucalense
Especialização em Design Gráfico
Visitar Website de este utilizador Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
14-10-2009, 10:38
Mensagem: #5
RE: Dúvidas de C (Eclipse)
Não causa transtorno nenhum, ora essa!!!

Deu o seguinte (a bold o que eu introduzi):

Introduza a sua string: string de teste

Introduza o caracter que quer remover da string:

A sua string original era: string de teste
A sua string tratada e: string de testee

Assim que se faz Enter deixa de se poder introduzir o caracter a eliminar.

Será que se pode trabalhar a str em vez de alocar memória e criar outra str, como que fazer um deslocamento para a esquerda do caracter (indice do vector) imediatamente a seguir ao caracter a eliminar?

Cumprimentos
PirotasCool
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
14-10-2009, 10:48 (Esta mensagem foi modificada pela última vez a: 15-10-2009 10:21 por rei007.)
Mensagem: #6
RE: Dúvidas de C (Eclipse)
Há aqui qualquer coisa que me está a falhar. Vou sacar o Alinex de propósito e instalar o eclipse só para testar esta situação. Isto devia funcionar porque é compatível com linux. Só se não estás a copiar tudo direitinho como eu te apresento.

(14-10-2009 10:38)Pirotas Escreveu:  Será que se pode trabalhar a str em vez de alocar memória e criar outra str, como que fazer um deslocamento para a esquerda do caracter (indice do vector) imediatamente a seguir ao caracter a eliminar?

Relativamente ao que tu dizes nós já fazemos isso. Uma grande falha do C é que não temos possibilidade ter mesmo uma string então temos de utilizar char vectoriais com ponteiros para o fazer e alocar em memória. Em c++ já tens strings e não te precisavas de preocupar com nada deste género.

Vou instalar e experimentar. Até ao final da manhã acho que ainda te digo algo.

Cumps,
Manuel Rocha

[Imagem: pplware_staff.png]
Licenciado em Informática para a Saúde pela ESTG Leiria
Mestrado em Informática - Especialização em Sistemas de Informação na Universidade Portucalense
Especialização em Design Gráfico
Visitar Website de este utilizador Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
14-10-2009, 12:01 (Esta mensagem foi modificada pela última vez a: 14-10-2009 21:54 por Ferreira.)
Mensagem: #7
RE: Dúvidas de C (Eclipse)
Já encontrei solução com o auxílio de um amigo que também tem esta cadeira:

main.c
Código:
#include<stdio.h>
#include "prat2.h"

int main(int argc, char **argv)

{
    char str[] = "stmrinmg dme temstme";
    char c = 'm';

    printf("%s\n",str);
    retirar(str,c);
    printf("%s\n",str);

    return 0;
}

.h
Código:
#ifndef PRAT2_H_
#define PRAT2_H_

#include <stdio.h>

int retirar(char str[], char c);

#endif /* PRAT2_H_ */

.c
Código:
#include "prat2.h"

int retirar(char str[],char c) /* int pois a função devolve um inteiro e não um caracter*/

{
    int i,j;

    for(i=j=0; str[i] != '\0'; i++)
        if (str[i] != c) {
            str[j] = str [i];
            j++;
        }
    str[j] = '\0';

    return str;
}

De qualquer das formas, mais uma vez obrigado pela disponibilidade e aproveito para deixar o aviso, voltarei com mais dúvidas.... Big Grin

Cumprimentos
PirotasCool
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
14-10-2009, 12:34 (Esta mensagem foi modificada pela última vez a: 15-10-2009 10:21 por rei007.)
Mensagem: #8
RE: Dúvidas de C (Eclipse)
Fico contente que tenha resolvido.

Cumps,
Manuel Rocha

[Imagem: pplware_staff.png]
Licenciado em Informática para a Saúde pela ESTG Leiria
Mestrado em Informática - Especialização em Sistemas de Informação na Universidade Portucalense
Especialização em Design Gráfico
Visitar Website de este utilizador Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
14-10-2009, 16:31 (Esta mensagem foi modificada pela última vez a: 14-10-2009 21:54 por Ferreira.)
Mensagem: #9
RE: Dúvidas de C (Eclipse)
Não sei porquê mas o código do ficheiro .c ficou incluído no .h, aliás, nem sei como é que as janelas com scroll surgiram!!! Smile Deixo o resto separado e vem visível para quem padeça do mesmo mal que eu Big Grin

.c
Código:
#include "prat2.h"

int retirar(char str[],char c) /* int pois a função devolve um inteiro e não um caracter*/

{
    int i,j;

    for(i=j=0; str[i] != '\0'; i++)
        if (str[i] != c) {
            str[j] = str [i];
            j++;
        }
    str[j] = '\0';

    return str;
}

Já agora, o nome que dei aos ficheiros foi:
Pasta: prat2
.c: main.c (é óbvio)
prat2.c
.h: prat2.h

Mais uma vez e nunca será demais, os agradecimentos de quem ainda vai precisar de muuuuuita ajuda.

Cumprimentos
PirotasCool
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
14-10-2009, 16:47
Mensagem: #10
RE: Dúvidas de C (Eclipse)
ora uma questão, noob possivelmente, porque é que a função retirar devolve um inteiro? isto porque el simplesmente altera a string a ser tratada?
assim sendo, não ficaria melhor se fosse do tipo void?
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
Colocar Resposta 


Saltar Fórum:


Utilizadores a ver este tópico: 2 Visitante(s)