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

blackmx

inverter strings (Ajuda)

16 mensagens neste tópico

estou com um problema com o seguinte código:

...

char *s="ola";

int i, len=strlen(s)-1;
char aux;



for(i=0;i<len;i++,len--){
aux=s[i];
s[i]=s[len];    //<-PROBLEMA -- "Segmentation fault (core dumped)"
s[len]=aux;

}

...

O objectivo é inverter uma string, neste caso a string "ola"->"alo"

O problema é que estou a ter "Segmentation fault (core dumped)" porque estoira nesta linha: s[ i]=s[len];

Alguem sabe pq? Como posso resolver?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema está em

s = s[len];

Estás a dar o valor para o apontador da string o valor de s[len]. Portanto na próxima passo do ciclo ao fazer s[len] ele vai estourar.

O que tu queres fazer é :

aux = s[i];
s[i] = s[len];
s[len]=aux;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema está em

s = s[len];

Estás a dar o valor para o apontador da string o valor de s[len]. Portanto na próxima passo do ciclo ao fazer s[len] ele vai estourar.

O que tu queres fazer é :

aux = s[i];
s[i] = s[len];
s[len]=aux;

Desculpa mas n entendi... parece que tenho igualzinho ao que tu dizes...

N estou a ver o erro. nem tenho em nenhum sitio s=s[len]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

N estou a ver o erro. nem tenho em nenhum sitio s=s[len]

Por acaso até tinhas. Atenção às tags BBCode... Quando quiseres escrever [ i], coloca um espaço no meio (como eu fiz), senão, em vez disso aparecer, passa o texto para itálico.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Altera

char *s="ola";

Para

char s[] = "ola";

Sinceramente, não sei explicar com certeza a razão. Eu penso que ao fazeres como tens, estás a igualar o valor do apontador aquela string (que dá asneira), enquanto que no segundo caso, assim dizes que tens um array de caracteres.

Volto a dizer... é a minha teoria... mas assim funciona.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Altera

char *s="ola";

Para

char s[] = "ola";

Sinceramente, não sei explicar com certeza a razão. Eu penso que ao fazeres como tens, estás a igualar o valor do apontador aquela string (que dá asneira), enquanto que no segundo caso, assim dizes que tens um array de caracteres.

Volto a dizer... é a minha teoria... mas assim funciona.

Já tinha visto essa solução, mas eu queria a solução com apontador pq isso era para ser feito numa função do tipo:

char *strrev(char *s)

e entao o s tinha que vir obrigatoriamente como *s

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu quase que apostava que se pode usar char *s="...";... Isto porque um array também não passa de um apontador.

Como tal, também não faz diferença a forma como se declara a variável, para se poder usar nas funções (ou seja, não eras obrigado a usar *s).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acabei de testar e o Rui Carlos tem razão, ambas as formas funcionam.

Também tinha a impressão que só funcionava como o mogers disse... :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Altera

char *s="ola";

Para

char s[] = "ola";

Sinceramente, não sei explicar com certeza a razão. Eu penso que ao fazeres como tens, estás a igualar o valor do apontador aquela string (que dá asneira), enquanto que no segundo caso, assim dizes que tens um array de caracteres.

Volto a dizer... é a minha teoria... mas assim funciona.

Já tinha visto essa solução, mas eu queria a solução com apontador pq isso era para ser feito numa função do tipo:

char *strrev(char *s)

e entao o s tinha que vir obrigatoriamente como *s

Independentemente disso, as funções funcionam....

Podes passar um char[] para uma função que receber um char* e vice-versa.... E as declarações também funcionam, obviamente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obviamente que não..

É completamente diferente alocar memória usando char s[]="ola" ou fazer char *s="ola".

Na segunda opção, ele não chega a alocar a memória.

Para isso, devem fazer um malloc após declarar a variável "char *s", e por não o fazerem vem o seg fault. Estão a aceder a posições de memória não declaradas.

O facto de dar em alguns e não noutros é elucidativo disso mesmo: certos sistemas operativos são mais piquinhas do que outros.

Repara que o facto de ser char *s não tem qualquer impedimento quando passado numa função. Tu recebes o apontador na função, mas a memória está declarada, logo não há qualquer impedimento se adaptares o teu código à função.

Edit: Este site confirma o que eu digo.

http://www.thescripts.com/forum/thread217140.html

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O espaço é alocado, tem que ser, senão a string não existia, depois da declaração....

A diferença é que o array é modificável.

Além disso pode definir-se no array um tamanho diferente do atribuido, e com o pointer não.

É isso que eles dizem no link, até...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acabei de testar e o Rui Carlos tem razão, ambas as formas funcionam.

Também tinha a impressão que só funcionava como o mogers disse... :(

Em minha casa:  windows + cygwin o código estoura...

Eu acho que a explicação do Warrior está correcta  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obviamente que não..

É completamente diferente alocar memória usando char s[]="ola" ou fazer char *s="ola".

Na segunda opção, ele não chega a alocar a memória.

Para isso, devem fazer um malloc após declarar a variável "char *s", e por não o fazerem vem o seg fault. Estão a aceder a posições de memória não declaradas.

O facto de dar em alguns e não noutros é elucidativo disso mesmo: certos sistemas operativos são mais piquinhas do que outros.

Repara que o facto de ser char *s não tem qualquer impedimento quando passado numa função. Tu recebes o apontador na função, mas a memória está declarada, logo não há qualquer impedimento se adaptares o teu código à função.

Edit: Este site confirma o que eu digo.

http://www.thescripts.com/forum/thread217140.html

Obrigado pelo esclarecimento.

Vou investigar isso do malloc. :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que o warrier está a dizer é válido e é uma preocupação que se deve ter. Se não tiverem cuidado... declaram um array ( tring whatever ) vão metendo outras coisas na memoria, depois voltam ao array inicialmente declarado... pimba... levam com um segmentation fault que é um mimo.

Mas neste caso não há grande problema, pois o conteudo da string é escrito na mesma instrução que a declara.

Tipo...

char *s="ola";
char s[]="ola";
//não há qualquer problema ( que me lembre ) em nenhuma delas

//agora

char *s;
// mais código aqui (...)

*s = "atirei o pau ao gato mas o gato nao morreu";
//cabum! segmentation fault!

Aqui está uma das vantagens do C++, alocar memória dinamicamente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O espaço é alocado, tem que ser, senão a string não existia, depois da declaração....

A diferença é que o array é modificável.

Além disso pode definir-se no array um tamanho diferente do atribuido, e com o pointer não.

É isso que eles dizem no link, até...

A questão é mesmo esta, no caso do array os caracteres são modificáveis. Quando se faz algo deste género

char * p = "olari lole";

o que estamos a fazer é exactamente o mesmo que isto

const char p [10] = "olari lole";

A única diferença aqui é que o tipo const não te deixa fazeres alterações aos caracteres enquanto que num array declarado como

char p [10] = "olari lole";

podes alterar à vontade os caracteres que não obténs segmentation fault.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas eu falei da questão numa perspectiva geral, não estava a falar em relação à alteração de strings..........

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora