zliczanie ciągu znaków "an" w tekście

0

Witam. Mam do zrobienia zadanie o treści: //"Napisz program, który wczytuje tekst wejściowy do znaku # i zwraca informację o liczbie razy, jaką występuje w nim ciąg an. Uwaga: Program będzie musiał "pamiętać" zarówno bieżący, jak i poprzedni znak. Do jego przetestowania możesz użyć zdania "Banany staniały."

Po walce z funkcjami if / else doszedłem do czegoś takiego i niby to działa, ale podejrzanie to wygląda (za prosto, a może działa przypadkiem?).
Może właśnie powinna w tym zadaniu zostać zastosowana funkcja if/else i jeśli tak to proszę o podpowiedź.

Dopiero zaczynam swoją przygodę z programowaniem i chętnie wysłucham opinii co do treści kodu jak i samego stylu.

#include <stdio.h>
#define TAK 1
#define NIE 0
#define STOP '#'
int main()

{
	char c;
	int w_an = NIE;
	int ile_an = 0;
	
	printf("Napisz jakis tekst, a program policzy dla Ciebie\n");
	printf("ile razy wystapil w nim ciag \"an\"\n");

	while ((c=getchar()) != STOP)
	{
		switch (c)
		{
			case 'a':	w_an = TAK;
						break;
			case 'n':	if (w_an == TAK)
						ile_an++;
						w_an = NIE;
						break;
		}
	}
	printf("uzyto %d razy ciagu \"an\"\n", ile_an);
	
	return 0;	
} 
0

Dzięki. Z kolei ten podany przez Ciebie będzie działał raczej dla podanego wcześniej w kodzie tekstu. Myślałem jeszcze właśnie o tablicach/stringach, ale w takim wypadku trzeba by zadeklarować jej rozmiar zawczasu co mogłoby ograniczyć tekst czy się mylę?

A co dokładnie masz na myśli mówiąc o formatowaniu przy case'ach?
Chodzi Ci o wcięcia? :)

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

unsigned str_occ_count(const char *src, const char *pattern) {
	unsigned count = 0;
	for(const char *temp = src; (temp = strstr(temp, pattern)); ++count, ++temp);
	return count;
}

int main(void) {
	printf("%u", str_occ_count("banana", "na"));
	return 0;
}

http://ideone.com/o6MWz0
stdout: 2

Ofc dla str_occ_count("Banany staniały", "na") daje 1

0

Powiem szczerze, że do takiego rozwiązania jak podałeś to pewnie jeszcze przez jakiś czas nie dojdę, ale dziękuję za przykład :).
Chodziło mi po prostu o takie najbanalniejsze rozwiązanie i ewentualnie info czy moje do czegoś się nadaję.

Wyżej wspomniano zdanie "Anna poranna" to przypuszczam dałoby się załatwić poprzez zamianę:

 
switch (toupper(c))
		{
			case 'A':	w_an = TAK;
						break;
			case 'N':	if (w_an == TAK)
						ile_an++;
						w_an = NIE;
						break;
		}
2

Po polskiemu:

unsigned policz_ilosc_znakow(const char *tekst_zrodlowy, const char *tekst_szukany) {
    unsigned ilosc_wystapien = 0;
    while(
    	//tekst_zrodlowy wskazuje na miejsce znalezienia szukanego tekstu
    	(tekst_zrodlowy = strstr(tekst_zrodlowy, tekst_szukany))
    	//zliczamy tak dlugo, jak mamy co zliczac (strstr zwraca NULL w przypadku nieznalezienia tekstu)
    	!= NULL
    ) {
    	//oficjalnie zwiekszamy ilosc wystapien
    	ilosc_wystapien += 1;
    	//zeby w kolko nie wskazywalo na ten sam znaleziony fragment, to po znalezieniu wskazujemy na kolejny znak od poczatku znalezienia tekstu
    	tekst_zrodlowy += 1;
    }
    return ilosc_wystapien;
}
0

Dzięki za uproszczenie :).
Trochę bardziej do mnie dotarło po Twoim tłumaczeniu.

Temat już do zamknięcia.
Pozdrawiam,

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