Warunek sprawdzający czy ostatni znak w tablicy to …

0

Cześć, nie mogę poradzić sobie z pewnym problemem, mianowicie chcę dodać do programu warunek:

jeżeli ostatni znak tablicy jest <jakiś znak>, to: ...

I nie bardzo wiem jak to zrobić. Próbowałem tak:

for (int i = 0; i <= strlen(tab); i++) {
    if ((tab[i-1]='\0') == 'a') { 
    }
}

ale coś nie działa, w czym leży problem?

2

Wygląda na to, że masz problem XY. Jeśli chcesz przeiterować po całej tablicy znaków, to wystarczy:
Jeśli to ciąg o nieznanej długości:

int len = strlen(tab);
for(int i = 0; i < len; ++i) {
    char c = tab[i];
    // ...
}

Jeśli to tablica, wektor, std::string lub inny kontener:

for(char c : tab) {
    // ...
}

Jeśli koniecznie musisz sprawdzić ostatni znak tablicy, to

int len = strlen(tab);
if(tab[len-1] == 'x') {
    // ...
}
0

Chodziło mi właśnie o ten 3 wariant co podałeś, jednakże nadal coś jest nie tak, ponieważ gdy ostatnim znakiem jest ten sam co w warunku, inne "ify" w ogóle się nie wykonują a ten cały czas, w efekcie dostaje kompletnie co innego niż powinienem :/

0

Ciężko dyskutować nie widząc kodu. Najlepiej przygotuj MCVE: https://dsp.krzaq.cc/post/445/jak-zadawac-pytania-na-forum/

0

już daje:

int slowa(char tab[])
{
	int len = strlen(tab);
	int spacje = 1;

	for (int i = 0; i <= len; i++) {
		if ((tab[i] == ' '{
			spacje++;
		}
		if((tab[i] == ' ' && tab[i-1]==' '){
			spacje--; 
		}
		if (tab[len-1] == ' ' ) { //jezeli ostatni znak jest spacja - odejmuje wartosc 1
			spacje--;
		}
	}
	return spacje;
}

np dla: "ala ma kota" daje wynik 3, czyli sie zgadza
a dla: "ala ma kota " daje mi -8 - pozostale ify wgl sie nie wykonuja ;/

0

To się nawet nie kompiluje.

Swoją drogą, masz tu off-by-one: for (int i = 0; i <= len; i++) {. Porównuj i < len

0

jak to się nie kompiluje?
przy (i<len) wynik daje -7 :/

0

Ponawiam prośbę o MCVE. Z Twojego opisu nie jestem w stanie wywnioskować co się powinno dziać.

0

funkcja ma zliczac liczbe slow na podstawie liczby spacji
pierwszy if przy kazdej napotkanej spacji ma dodac 1
drugi if jesli napotka spacje wielokrotne ma odejmowac 1

jak tyle mialem to wszystko ladnie dzialalo, jednak chce dodac przypadek kiedy ostatnim znakiem jest spacja, stad ten trzeci if.

np dla: "ala ma kota" daje wynik 3, czyli sie zgadza
a dla: "ala ma kota " daje mi -8 - pozostale ify wgl sie nie wykonuja ;/

kod wyzej

0

Skąd wiesz, że się nie wykonują?

Sprawdzenie wykonujesz w pętli, a więc tyle razy ile znaków ma string. Z opisu zakładam, że chciałeś go dokonać wyłącznie raz.

2

Przenieś ten ostani if poza for. @KrzaQ nawet to uwzględnił w pierwszej odpowiedzi. Nie będzie potwierdzał przy każdej iteracji, że ostatni znak jest spacją.
Przy okazji, Twój kod może się kompilować, ale na pewno się wywali, jeśli pierwszym znakiem będzie spacja. Warunek
if((tab[i] == ' ' && tab[i-1]==' ')) rzuci Ci naruszenie pamięci. W innych przypadkach drugi warunek nie jest sprawdzany.

0

Dobra, rozumiem czemu trzeci if ma być poza pętlą (w sumie logiczne XD)
tylko jak sobie poradzić z tym błędem? po zakończeniu programu pokazuje mi coś takiego(niezależnie od tego czy spacja jest pierwsza):

0

Ciężko powiedzieć nie widząc kodu, pewnie gdzieś masz problem z pisaniem po niezaalokoawnej pamięci.

0

Dobra, ogarnąłem.

Chciałbym jednak jeszcze zapytać o dokładniejsze wyjaśnienie:

Warunek
if((tab[i] == ' ' && tab[i-1]==' ')) rzuci Ci naruszenie pamięci. W innych przypadkach drugi warunek nie jest sprawdzany.

nie bardzo rozumiem w jakiś sposób pamięć jest naruszana

2
Panda123 napisał(a):

Dobra, ogarnąłem.

Chciałbym jednak jeszcze zapytać o dokładniejsze wyjaśnienie:

Warunek
if((tab[i] == ' ' && tab[i-1]==' ')) rzuci Ci naruszenie pamięci. W innych przypadkach drugi warunek nie jest sprawdzany.

nie bardzo rozumiem w jakiś sposób pamięć jest naruszana

Dla i=0 próbujesz odczytać wartość spoza pamięci przydzielonej dla tej tablicy.

1

Drugi warunek jest sprawdzany tylko gdy spełniony jest pierwszy. Jeśli pierwszym znakiem (tab[0]) jest spacja, to próbujesz sprawdzić jaki jest poprzedni znak dla znaku poprzedniego (tab[-1]), a to jest UB

0

Ok, rozumiem.
Dziękuję bardzo za pomoc i poświęcony czas. ;)

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