#include /* Funkcija my_gets za citanje stringova sa standardnog ulaza (stdin), po nacelu "jedan string u jednom redu". Ucitava cijeli red ulaza, do (ukljucivo) kraja reda, kraja datoteke ili greske. U polje s (string) sprema najvise n - 1 znak s ulaza (bez kraja reda) i dodaje nul-znak. Eventualni visak znakova u redu se ignorira (preskace). */ char *my_gets(char *s, int n) { /* Izlazna (povratna) vrijednost funkcije. Inicijaliziramo ju na s, ocekujuci da ce funkcija uspjesno obaviti posao. Ako treba, kasnije postavljamo izlaz = NULL. */ char *izlaz = s; /* Indeks prvog "slobodnog" mjesta u polju s, trenutno = 0. */ int i = 0; /* Maksimalni indeks za polje s, ucitani znak. */ int max_i, c; /* Provjera ogranicenja na argumente (s != NULL i n > 0). U slucaju prekrsaja, funkcija se NE vraca odmah, jer MORA ucitati cijeli red (liniju) teksta. */ if (s == NULL || n <= 0) { izlaz = NULL; n = 0; /* Koristimo u nastavku. */ } /* Maksimalni indeks za spremanje elemenata u string s. */ max_i = n - 1; /* Petlja za citanje jednog cijelog reda (linije) teksta s ulaza (stdin), sve do (prvog) kraja reda (\n), EOF-a ili greske. Beskonacna petlja, izlaz je s break. */ while (1) { /* Ucitaj sljedeci znak - funkcija getchar vrati EOF ako naidje na kraj datoteke ili gresku. */ c = getchar(); /* Provjera kraja citanja - izlaz iz petlje. */ if (c == '\n' || c == EOF) break; /* Spremi znak c, ako stane u string. U slucaju prekrsaja ogranicenja (pogresnih argumenata), sigurno NEMA spremanja, jer je i >= 0 > max_i = -1. */ if (i < max_i) { s[i] = c; /* Spremi znak. */ ++i; /* Povecaj i za sljedeci znak. */ } } /* Ako je n > 0 (<=> argumenti su bili korektni), onda zavrsavamo string, tj. dodajemo nul-znak iza ucitanih. Ako treba, postavljamo izlaz na NULL. */ if (n > 0) { /* Kraj stringa. Ovdje je 0 <= i = max_i = n - 1. */ s[i] = '\0'; /* Provjera zadnjeg ucitanog znaka. Ako je to EOF, onda testiramo dalje. */ if (c == EOF) { /* Provjera greske prilikom citanja. */ if (ferror(stdin)) izlaz = NULL; /* Provjera kraja datoteke prije prvog znaka. Zbog c == EOF i NIJE greska, ovdje bi moralo biti feof(stdin) == 1, no svejedno provjerimo i to. */ else if (i == 0 && feof(stdin)) izlaz = NULL; } } return izlaz; }