Funkcja sprawdzajaca czy tekst jest palindromem

2015-01-25 14:08
0

Czesc. Wydaje mi sie ze sama funkcja jest dobra ale jestem pewny ze cos skopalem w mainie z przydzielaniem pamieci dla ciagu znakow. W C++ jest string a tu nie wiem jak powinno wygladac.

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

int fPalindrom(char *tab, int n)
{
    int i=n/2;
    for(i=n/2;i>=0;i--)
    {
        if(tab[i]!=tab[n-i])
        return 0;
    }
    return 1;
}
int main()
{
    char *tekst;
    int i=0;
    tekst=(char*)malloc(2*sizeof(char));
    printf("Wpisz tekst: ");
    for(i=0;(tekst[i] = getchar()) != '\n';++i)
    {
        tekst = (char*)realloc(tekst,(3+i)*sizeof(char));
    }
    tekst[i+1]='\0';
    i=0;
    while(tekst[i]) i++;
    printf("Tekst \"%c\" ",tekst);
    if(!fPalindrom(tekst,i)) printf(" nie ");
    printf("jest palindromem.\n");
    free(tekst);
    system("pause");
    return 0;
}

Pozostało 580 znaków

2015-01-25 14:13
0

%c tak to nie wypiszesz tekstu tylko jeden znak...


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-01-25 14:31
0
int fPalindrom(char *tab, int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        if(tab[i]!=tab[n-i])
        return 0;
    }
    return 1;
} 

Cos mi sie tu nie zgadza. Zaczynami od i = 0. jezeli tab[0] jest rozny od tab[n-0] to nie jest palindrom. Potem i++ itd gdzie jest blad?

I jeszcze mam pytanie. Jaka funkcja w C mozna uzyskac efekt podobny do mojego:

i=0; while(tekst[i]) i++;

W C++ mozna bylo uzyc str.length()

edytowany 1x, ostatnio: Craith, 2015-01-25 14:33

Pozostało 580 znaków

2015-01-25 14:32
0

Nie ma takiego indeksu jak tab[n]. Jak tablica ma N elementów to ostatni indeks to N-1


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-01-25 14:34
0

Na oko to powinno być n-i-1.

Craith napisał(a):

I jeszcze mam pytanie. Jaka funkcja w C mozna uzyskac efekt podobny do mojego:

i=0; while(tekst[i]) i++;

W C++ mozna bylo uzyc str.length()

strlen()

edytowany 1x, ostatnio: twonek, 2015-01-25 14:35

Pozostało 580 znaków

2015-01-25 14:36
0

Dobrze wiem o tym i dlatego jako parametr funkcji przyjalem sobie n czyli ciag n elementow bez znaku NULL. Czy to tak powinno wygladac? Dziwne bo myslalem ze dobrze rozumowalem.

int fPalindrom(char *tab, int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        if(tab[i]!=tab[n-1-i])
        return 0;
    }
    return 1;
} 

Dodatkowo mam pytanie czy znacie jakis sprytniejszy pomysl jak zapisac inaczej to:

for(i=0;(tekst[i] = getchar()) != '\n';++i)
    {
        tekst = (char*)realloc(tekst,(3+i)*sizeof(char));
    } 
edytowany 1x, ostatnio: Craith, 2015-01-25 14:37

Pozostało 580 znaków

2015-01-25 14:38
1

Jak masz ciąg 5-literowy, to zajmują indeksy od 0 do 4, a null zajmuje indeks 5. Długość ciągu to 5, ale tab[5] nie wskazuje na element ciągu.

Pozostało 580 znaków

2015-01-25 14:55
0

No okej rozpisalem sobie to i zgadzam sie.
Ale chcialbym uzyskac odpowiedz na to:

Dodatkowo mam pytanie czy znacie jakis sprytniejszy pomysl jak zapisac inaczej to:

for(i=0;(tekst[i] = getchar()) != '\n';++i)
{
tekst = (char*)realloc(tekst,(3+i)*sizeof(char));
} 

Pozostało 580 znaków

2015-01-25 15:12
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0