Funkcja sprawdzajaca czy tekst jest palindromem

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;
}
 
0

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

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()

0

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

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()

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));
	} 
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.

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));
	} 

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