Jump to content
Sign in to follow this  
Palmeira

[Dúvida] Teste palíndromo e função inverter string

Recommended Posts

Palmeira

Boas noites, no decorrer da preparação de um exame de programação estive a resolver uns exercícios, dos quais não tenho resolução para comparar com as minhas resoluções e surgiram-me alguns problemas com este exercício:

-> Especifique uma função que recebe uma string e verifica se a mesma é capicua(eu chamo-lhe palindromo), ou seja se lida da esquerda para a direita ou da direita para a esquerda é a mesma palavra. Exemplo : ovo, ana, rapar.

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

void inverter(char *s);

void inverter(char *s)
{
    int c, i, j;

    for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}

int main (){

char *str;
char aux;

printf("\n Insira uma string: \n");
gets(str);

//inverter a string e testar
inverter(str);
strcpy(str,aux);

if(strcmp(str,aux) != 0) {
	printf("E' Palindromo");
}
else {
	printf("Nao e palindromo!");
}
system("PAUSE"); //sei que não é boa prática, mas é só para poupar tempo
}

quando compilo o código (sem warnings, nem erros) parece-me que a execução para ao inverter a string "s" ..

ainda não estou muito á vontade com pointers também, pode ser esse um dos erros também.

Cumprimentos,

EDIT : a função para testar se é capicua ou não, não está codificada, mas parece-me não ser para já um grande problema, o problema mesmo é inverter a string (ou cadeia de caracteres :P )

Deixo também uma questão, é mais difícil seguir esta via ou resolver o problema recorrendo á tabela ASCII ?

Share this post


Link to post
Share on other sites
Localhost

A tua função inverter está correcta.

Tens vários problemas no teu código:

* Não declaras correctamente as strings;

* Utilizas a função gets;

* A suposta string aux não contém nada e tu estás a copiar o seu conteúdo para a outra string;

* A função strcmp retorna 0 caso as strings forem iguais e não outro valor;

Para resolver isto, tinhas de primeiro copiar o conteúdo de str para aux e passar esta última para a função inverter e depois utilizar a função strcmp para comparar.

Obviamente existia uma maneira muito mais simples de fazer isto que seria comparar as posições simétricas da string no entanto, resolve primeiro dessa maneira que pensaste.


here since 2009

Share this post


Link to post
Share on other sites
Palmeira

Obrigado pela resposta :P , estava convencido de que a função strcpy recebia a string a ser copiada no 1º arg e copiava para a string do 2º arg.

int main (){
    char *s;
    char *aux;

    printf("\n Insira uma string: \n");
    scanf("%s", s);
    strcpy(aux, s);
    printf("%s", aux);

    system("PAUSE"); 
}

a execução estoura na mesma, decidi excluir as comparações e a função "inverte" deste código, aquilo que me parece, e tal como referiste, é que eu não estou a declarar as "strings" correctamente, logo decidi focar-me neste aspecto, e entendê-lo, e partir depois para o resto.

podes explicar-me por favor, e se souberes é claro, como declarar as strings com apontadores (eu já sei que estão como apontadores, mas não consigo entender o que está mal), e os apontadores são o meu 'calcanhar de aquiles' para já.

estive a ver outros exemplos de implementação de apontadores com strings, nomeadamente contar a ocorrência de um char "X" numa palavra, e pela "tradução" algorítmica que consigo é que em comparações tenho de usar a variável "*s", que quer dizer 'conteúdo da variável "s" certo', e para incrementos e decrementos(por exemplo) uso somente "s"??

Share this post


Link to post
Share on other sites
bubulindo

Eu posso estar errado... mas, e se "medires" o tamanho da string e depois comparares o indice 0 com o indice final, etc, etc... não seria mais fácil que copiar strings dum lado para o outro?

É só outra maneira de ver o problema... digo eu.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Localhost

@Palmeira: o problema é que ao declarares assim as strings elas são read-only, ou seja, não as podes alterar.

Tens de fazer algo como isto:

#define MAX 120

char str[MAX];

@bubulindo: vê o último parágrafo do meu último post.


here since 2009

Share this post


Link to post
Share on other sites
Baderous

Não é questão de ser read-only, porque ali não se está a alterar nada, é questão de que aquilo são meros apontadores para caracter, não são strings.

Share this post


Link to post
Share on other sites
bubulindo

@bubulindo: vê o último parágrafo do meu último post.

Escapou-me por completo. Desculpa.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Localhost

Não é questão de ser read-only, porque ali não se está a alterar nada, é questão de que aquilo são meros apontadores para caracter, não são strings.

Ao fazermos algo como o que vou apresentar a seguir, elas não são read-only?

char *str = "hello";


here since 2009

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
Sign in to follow this  

×
×
  • 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.