• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Cypher

[Resolvido] Funcao para tirar caracter da string!!

18 mensagens neste tópico

Boas !!!

gostava que alguem desse aqui uma olhadinha ao meu codigo !!

ex:

cria tirar da palavra "P@P" primeiro o "p" depois o "@" e o ultimo "p" esta aki a minha funcao , mas esta qualquer coisa mal na minha funçao da erro!

char *sacar_p(char *s,int i){
char p[1];
strcpy(p,s[i]);
return p; 
}

a variavel i era o indice por exemplo metia ao enviar pra funcao i=3 e tirava o "p"  de "p@p"

o que se passa esta bem a funçao??

cumps....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

strcpy(p,s);

Copiar um caracter para um char* !!

Devem ser ambos char* de preferência que acabem com um caracter nulo.

Não é correcto retornar um ponteiro cujo scope está apenas no bloco da função. Já tem sido comentado este aspecto algumas vezes aqui no forum.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Melhor... qual é a ideia de usar uma função destas?

queres o 3º caracter de "p@p": s[ 2 ];

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Melhor... qual é a ideia de usar uma função destas?

queres o 3º caracter de "p@p": s[ 2 ];

  :confused: era so um exemplo...

a ideia era mesmo numa codificacao de canal fazer a matriz de paridade e tirar de uma bitstream os caracteres !!

ja percebi o vosso ponto de vista ... e nao tem logica é a maneira que eu meti o topico!!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já não vai a tempo , mas ficas a saber  :)

é simples... tas a usar a função strcpy, logo vais copiar 2 strings, se lhe tas  a dar como segundo argumento um caracter logo da erro (s [ i] )  :wallbash:

tens de fzr tipo isto:

declaras uma variavel do genero:

char ch[2];
ch[0]=s[i];
ch[1]='\0';
strcpy(pra_onde_keres_copiar, ch);

assim ja não da erro porque tas a copiar uma string...

Cumps  :D

P.S: Pa proxima vens ao msn e perguntas  :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mete dentro do strcpy assim: (p,s[i-1]), ja fica td bem, tendo em conta que estas a passar bem os parametros da funçao.

o erro que estão aí a falar dá page fault se o ppl tiver razao, se o ppl nao tiver razao, e continuar a dar erro e pq tas a passar mal as cenas para  funçao.

Se tivesses a passar o inteiro usando o stringcopy tenho a certeza que dá page fault, mas como a funçao recebe dois apontador para char nao deve dar erro nenhum, nao faz sentido, tanto podes mandar strings como chars.

[]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uau... desculpem lá o mau feitio, mas porque continuam a responder se a questão já foi esclarecida, e ele até viu que pegou no problema da forma errada? Os dois últimos posts só aumentam a confusão: o 1º complica, e o 2º está errado.

Além disso, o erro do post do bertolo é explicado no post do LakOr. Mas ainda assim eu vou repetir:

strcpy(p, s[i-1]);

sendo s um array de chars não funciona porque s[i-1] é um char, e não um char*. O que é enviado à função é o valor do char da posição i-1 de s. Quando muito, poder-se-ia fazer

strcpy(p, &s[i-1]);

. Mas isto também era errado, porque iria copiar para p todos os caracteres de s a partir da posição i-1, até encontrar o caracter terminador de s.

Como já foi dito (e entendido), a função não devia existir, mas a existir devia ser (redundante e) simplesmente

char *sacar_p(char *s,int i){
return s[i];
}

como a funçao recebe dois apontador para char nao deve dar erro nenhum, nao faz sentido, tanto podes mandar strings como chars.

Podes mandar apontadores para char, só apontadores.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o que eu disse nao tava mal eu so disse que caso ele enviasse char nao tenhoa  certeza se dava erro, agora se ele enviar inteiro da page fault com toda a certeza (exp propria).

concordo com a tua soluçao.

btw a funçao q o rapaz ai postou so mostra que ele tem de estudar passagem por referencia pq nao faz sentido passar por referencia e retornar ao mesmo tempo. gg

ps: ist > isel :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é passagem de um endereço. Por referência era char &sacar_p, e teria que ser C++

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

discordo totalmente...lê cap 9 do damas pag 311. consegues passar variaveis por referencia em C senao vê a funçao strcpy do string.h.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já que referencias o livro do Damas, vai à página 312. Está lá bem específico:

EM C SÓ EXISTE PASSAGEM DE PARÂMETROS POR VALOR

E depois diz que a salvação é passar Apontadores.

Ah grande Damas. Apontadores, e não ponteiros. É assim mesmo!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

qd passas um endereço e, nao uma copia de alguma cena...e depois na funçao ou metes duplo ** ou metes * e * na funçao (como tem aki este post inicial) chama.s passagem por referencia. tens de ler o damas...ele diz isso precisamente  numa linha em rodape, agora isso n quer dizer q n possas passar variaveis por referencia em C, coisa q eu tou farto de fazer.

lol tá a negrito e tudo.....atao explica-me o que faz uma funçao deste tipo

char *siga(char *a);

eu acho: que recebo uma referencia (endereço da var), e sem criar uma copia explicitamente da variavel eu consigo altera-la.

e verdade q nao sao alterados os valores dos endereços...mas qd ao valor da variavel esse podes alterar utilizando a sua referecia (endereço)

eu sou caloiro...e normal q o diga está errado :)

tamos aki e pa aprender

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Reformulando. Dado que não percebi o teu post anterior, vamos ver se nos entendemos.

char *sacar_p();

é a assinatura de uma função que retorna um apontador para char, e não uma referência para char. Já

char &sacar_p();

, que, friso, é código C++, e é impossível em C, é a assinatura de uma função que retorna uma referência para char.

Quanto aos parâmetros é a mesma coisa:

void func(char *pc);

recebe como parâmetro um apontador para char, e para alterares o seu conteúdo fazes

*pc='c';

.

void func(char &c);

que, mais uma vez, é código C++, e é impossível em C, recebe como parâmetro uma referência para char, e para a usares fazes

c='c';

.

E a diferença entre referências e apontadores está aí. Não há mistura entre os dois, como é dito no livro do Luís Damas: a passagem de apontadores é uma forma de contornar a inexistência do conceito de "passagem por referência" em C.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu acho que o TheDark tem razao... porque é que continuam a responder ao topico ... ja tinha dito no meu ultimo que tava a fazer confusao e nao tinha logica nenhuma a pergunta que fiz ...

cumps...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu acho que o TheDark tem razao... porque é que continuam a responder ao topico ... ja tinha dito no meu ultimo que tava a fazer confusao e nao tinha logica nenhuma a pergunta que fiz ...

cumps...

Resolvido :)

abraços, HecKel

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Convidado
Este tópico está fechado a novas respostas.