Tablica znaków - EOF

0

Cześć! Mam za zadanie napisać kod, który będzie podawał liczbę liter, cyfr oraz 'linii' wprowadzonych przez użytkownika linii tekstu. Zakończenie podawania następuje przy EOF'ie. Napisałem coś takiego:

puts("Podaj linie tekstu: (Ctrl+Z -> EOF)");
	do{
	
		gets(tablica);
		wiersz++;
		n = strlen(tablica);

		for (i = 0; i <=n; i++) {
			if (isalpha(tablica[i])) {
				znak++;
			}
			if (isblank(tablica[i])) {
				spacja++;
			}
			if (isdigit(tablica[i])) {
				cyfra++;
			}
			if (ispunct(tablica[i])) {
				graph++;
			}
			if (isspace(tablica[i])) {
				enter++;
			}
		}	
	} while (getchar() != EOF);
		
	printf("\n\n");
	printf("Litery=%d\nCyfry=%d\nSpacje=%d\nZnaki=%d\nLinijki=%d", znak, cyfra,spacja,graph,wiersz);
	getchar();

Niestety program nie zlicza pierwszych liter w każdej nowej linii.
Wydaje mi się, że to przez to iż sprawdzanie EOF'a 'przesuwa' wskaznik o jedno miejsce - mam racje?
Jakieś propozycje jak to poprawić? :)

0

ungetc().
Co się stanie jak nie wprowadzę nic tylko od razu nacisnę ctrl-z?

0

Dopiero za drugim razem funkcja orientuje się że został wprowadzony EOF dlatego zamieniłem z

do{...}while(getchar() != EOF) 

na

while(getchar() != EOF){...}

i teraz od razu sprawdza.
Niestety chyba nie wiem jak użyc ungetc()

1

Zauważ, że możesz zapamiętać wartość zwracaną przez getchar() i jej użyć.

0

Rzeczywiście, przekombinowałem :D
Poprawiłem program używając

while (c != EOF) {
		tablica[i] = c;
		++i;
		c = getchar();
	}

i wszystko działa idealnie. Dziękuje za pomoc i poświęcony czas!

0

powinno być:

char line[256];
while (fgets(stdin, line, sizeof(line))) {
     int n = strlen(line);
     if (n > 0 && line[n - 1] == '\n') {
           ++newLineCharsCount;
     }
    ....
}

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