Altro esercizio..pls helpme

Ecco l'ennesimo esercizio del proff risolto prima dell'esame.

codice:
Esercizio 2    (max 10 punti)

Scrivere una funzione, con prototipo int Inv(char *nameF, char *invF), che legge il file di tipo testo il cui nome è nella
stringa nameF, contenente una sequenza di stringhe separate da spazi, e crea un nuovo file di testo, con nome dato dalla stringa invF,
scrivendoci la sequenza inversa e ritorna la massima lunghezza delle stringhe. Le stringhe hanno una lunghezza non superiore a 100.
Ad esempio se il file nameF contiene la sequenza giallo verde blu allora il nuovo file deve contenere
blu verde giallo e la funzione deve ritornare 6.
Soluzione Esercizio 2
/* Funzione ausiliaria che ritorna la k-esima stringa del file f. Se tale stringa
   non esiste ritorna NULL                                                        */
const char *KthStr(FILE *f, int k)
{   
    static char str[101];
    rewind(f);
    while (k > 0 && fscanf(f, "%s", str) == 1) k--;
    return (k == 0 ? str : NULL);
}
int Inv(char *nameF, char *invF)
{
    FILE *f = fopen(nameF, "r");        //Apri il file in lettura
    FILE *newF = fopen(invF, "w+");     //Crea ed apri il nuovo file
    int nStr = 0, max = 0;
    char str[101];                            //Calcola il numero di stringhe
    while (fscanf(f, "%s", str) == 1) nStr++;
    while (nStr > 0) {                        //A partire dall'ultima stringa,
        const char *s = KthStr(f, nStr);      //leggi le stringhe in ordine inverso
        int len = strlen(s);                  //e scrivile nel nuovo file,
        if (len > max) max = len;             //aggiornando il calcolo della
        fprintf(newF, "%s ", s);              //lunghezza massima.
        nStr--;
    }
    fclose(f);
    fclose(newF);
    return max;
}
La funzione ausiliaria riceve il numero del k-esima stringa el la ritorna:
ma che vuol dire: while (k > 0 && fscanf(f, "%s", str) == 1) k--; perchè nel corpo del while viene anche inserito che fscanf deve essere == 1 ? Se io gli passo il numro della stringa da restituire e gli dico di ciclare finchè non ci arriva non è uguale?!?!

Altra cosa....

che significa questa riga (mi ci impiccio ancora con le scritture compresse):
return (k == 0 ? str : NULL);

Grazie e scusate la mia estrema ignoranza